jQuery 承诺在数组上模拟函数的同步调用
jQuery promise to simulate synchronous calls of function over array
假设我需要同步上传文件。相继。
我找到了这个 Whosebug 主题。并修改了代码:
var arr = ["file1", "file2", "file3"];
var d = $.Deferred().resolve();
while (arr.length > 0) {
d = d.then(uploadFile(arr.shift()));
}
function uploadFile(file){
var d = $.Deferred();
setTimeout(function(){ console.log("Uploading file:"+file); d.resolve(""); },1000);
return d.promise();
}
但我仍然让它们全部异步调用,但超时为 1000。
这是fiddle:fiddle
解决方案:
非常感谢菲利克斯。这里正在工作 fiddle
您必须将函数传递给 .then
。当前,您正在循环内立即调用 uploadFile
并将承诺传递给 .then
而不是函数。
您可以在不使用循环的情况下执行以下操作:
d.then(function next() {
var promise = uploadFile(arr.shift());
return arr.length === 0 ? promise : promise.then(next);
});
这使用间接递归而不是循环。
假设我需要同步上传文件。相继。 我找到了这个 Whosebug 主题。并修改了代码:
var arr = ["file1", "file2", "file3"];
var d = $.Deferred().resolve();
while (arr.length > 0) {
d = d.then(uploadFile(arr.shift()));
}
function uploadFile(file){
var d = $.Deferred();
setTimeout(function(){ console.log("Uploading file:"+file); d.resolve(""); },1000);
return d.promise();
}
但我仍然让它们全部异步调用,但超时为 1000。
这是fiddle:fiddle
解决方案: 非常感谢菲利克斯。这里正在工作 fiddle
您必须将函数传递给 .then
。当前,您正在循环内立即调用 uploadFile
并将承诺传递给 .then
而不是函数。
您可以在不使用循环的情况下执行以下操作:
d.then(function next() {
var promise = uploadFile(arr.shift());
return arr.length === 0 ? promise : promise.then(next);
});
这使用间接递归而不是循环。