问题背景:上一篇博客说到回调函数,回调函数往往容易带来同步异步的问题。我收集到了几种解决办法,总结一下。
一、先展示一下出现了什么问题
callback:function(list){
list.append('a');
} //callback函数
A:function{
var list=[];
for(var i=0;i<n;i++){
B:function(callback){
callback(list);
console.log(list); //这里可以获得每次加了a之后的结果
}
}
console.log(list); //这里输出的是[]
}
//这一小段代码是个简单的说明,可能存在纰漏,欢迎指出~
值得思考的是,为什么在for循环外,想要输出list的时候,输出的是[ ],根本没有append嘛摔!
二、为什么出现这个问题?
这是因为啊,B里的callback是回调函数,回调默认是异步的。整个程序在执行时呢,是分同步和异步两大块,先执行同步的,再执行异步的。也就是说,先执行了后一句console.log(list);再执行callback,所以当然是[ ]的咯。
三、怎么解决问题?
有几种方式
1.
.ajaxSettings.async=false;//锁住,以下程序同步执行
.
a
j
a
x
S
e
t
t
i
n
g
s
.
a
s
y
n
c
=
f
a
l
s
e
;
/
/
锁
住
,
以
下
程
序
同
步
执
行
.ajaxSettings.async = true; //解锁,以下程序异步执行
当数据量小的时候可以这样做,当数据量大的时候用户体验会很差,因为这个是这样是锁住在等拿到数据。
2.用setInterval定时器。你不是要等等才能拿到结果吗?那我就循环检查,看你什么时候拿到结果(傲娇)
3.用promise。这个是比较新的做法,我所在的项目组还才支持IE6,用不上这个(手动微笑)。