以下示例: 为什么当我用函数调用函数fct1时,函数之间会失去异步。 函数的执行顺序为:fct3,fct2,fct1而不是fct1,fct2,fct3
function fct1(param1) {
var d = $.Deferred();
setTimeout(function() {
console.log("fct1 : param1 =" + param1);
d.resolve();
}, 3000);
return d.promise();
};
function fct2() {
var d = $.Deferred();
setTimeout(function() {
console.log("fct2");
d.resolve();
}, 2000);
return d.promise();
};
function fct3() {
var d = $.Deferred();
setTimeout(function() {
console.log("fct3");
d.resolve();
}, 1000);
return d.promise();
};
var fct_array = [fct1(1), fct2, fct3];
var d = $.Deferred().resolve();
while (fct_array.length > 0) {
d = d.then(fct_array.shift());
}
答案 0 :(得分:2)
将fctl()函数定义更改为:
function fct1(param){
var p =param;
var f = function(p){
var d = $.Deferred();
setTimeout(function() {
console.log("fct1 : p=" + p);
d.resolve();
}, 5000);
return d.promise();
}
return f.bind(this,p);
};
原因是在初始化数组fctl(1)
时执行函数fct_array
之前。因此,稍后调用它.then
已经解决了。
注意:当您将对象d重新初始化为d=d.then(fct_array.shift());
时,无需更改while循环
因此,
while (fct_array.length > 0) {
d = d.then(fct_array.shift());
}
/* is equal to :
d=d.then(fct_array.shift()).then(fct_array.shift()).then(fct_array.shift());
*/
实施:JSBin