下面的例子:为什么当我用参数调用函数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());
}发布于 2016-10-03 15:05:15
将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());时,不需要更改Thus循环,
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());
*/Implementation:JSBin
https://stackoverflow.com/questions/39834373
复制相似问题