下面的例子: 为什么当我用参数调用函数 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());
}
最佳答案
将 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);
};
原因是在初始化数组fct_array
时执行函数fctl(1)
之前。因此后来调用 .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
关于javascript - 带参数异步调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39834373/