关于昨天作业的答案
输出结果是什么
刚看到这个题目,会以为输出的是1,2,3,4,5,6
因为定时器是一个异步操作,会在同步代码执行结束后才能执行,也就是for循环执行结束后 i 就变成了6。
怎么让他输出从0到5
for(var i = 0; i < 6; i++ ) {
// console.log(i);
(function(a){
setTimeout(function timer () {
console.log(a); //操纵变量a,和i无关
}, i*1000);
})(i)
}
上次就有讲过 本次作业是关于闭包的,所以今天这一题就用闭包的方法来跟大家讲,后续我会更新更简单的方法给大家
此时为啥就这样输出了呢?
这里就用到了闭包,新建一个作用域(function(a){})(i),把每次循环得到的i保存起来,闭包形成的作用域也不会被销毁,闭包其实就是函数对上级作用域中变量的捕获,函数在,闭包在,函数没人引用了,闭包也就随之被销毁。
现在有这么个需求。我有三个ajax,要求他们异步发送,但是要按发送顺序把他们的结果存进一个数组里,简述一下实现思路即可
假设这里现在有三个ajax请求参数不一样,
他们分别是有序列表的三行数据,所以这三个ajax的结果也需要按顺序放置因为我们并不知道他们什么时候返回结果。这里的ajax就像上一题里面的setTimeout,但是我们并不知道返回时间,所以发送请求时我们可以给ajax编号,第一个ajax的结果放在数组第一位,以此类推,第二个第二位,第三个第三位,每轮循环的时候保存这个编号,这就是闭包,由于业务方要求三个请求一起发送,此时promise和async await都没法用,只能用闭包,因为 promise和async都会把几个异步任务整理成同步队列 ,上一个完成了下一个才会执行,不能满足同时发送的要求。
这里跟大家分享下今天工作遇到的一个问题
我这边拿到了数据,并把数据放入lists数组中,
但是列表中数据依然空空如也?我的数据呢?
数组里的对象属性增减也不触发双向绑定。数组没有对象那样的双向绑定。
// this.reasonLists[i].title = response.data.title
this.$set(this.checkMain[i],'title',response.data.title)
this.$set(this.checkMain[i],'model',response.data.model)
// console.log(this.reasonLists[i].title)
以后遇到vue里数据更新了视图没更新,要条件反射想到是数组没法双向绑定的问题。
希望对你有所帮助,前两题,可以参考这个地址 博主讲的很细https://www.cnblogs.com/hahazexia/p/9446585.html
网友评论