例如我有20个超时,由window.setTimeout创建,我希望它们一个接一个地运行:
呼叫超时1 =>完成呼叫超时后2 =>完成呼叫超时3之后等等。
通常有一系列函数和超时数量未修复。
我的延期功能:
function someFunction(index) {
console.log("someFunction called, index = " + index);
var $deferred = $.Deferred();
window.setTimeout(function () {
$deferred.resolve();
}, 2000);
return $deferred.promise();
}
for loop :
var $deferred;
$(someArray).each(function (index) {
if (!$deferred) {
$deferred = someFunction(index);
} else {
$deferred.then(function () {
return someFunction(index);
});
}
});
所有其他人在没有链的情况下立即运行
答案 0 :(得分:1)
如果你想一个接一个地链接它们,你必须这样做:
var $deferred;
$(someArray).each(function (index) {
if (!$deferred) {
$deferred = someFunction(index);
} else {
$deferred = $deferred.then(function () {
return someFunction(index);
});
}
});
您正在做的是将所有.then()
处理程序放在相同的延迟处,它们将并行运行它们,而不是串行运行。你需要的是相当于p.then(...)。then(...)。then(...)。由于每个.then()
都会返回一个新的承诺,因此您需要链接到链中的下一个链接。
您可能会发现这种设计模式更简单,可以使用生成承诺的异步操作顺序迭代数组:
someArray.reduce(function(p, item) {
return p.then(function() {
return someFunction(item);
});
}, $.Deferred().resolve()).then(function() {
// all done here
});
答案 1 :(得分:0)
尝试使用$.queue()
,$.dequeue()
,$.map()
function someFunction(index) {
console.log("someFunction called, index = " + index);
var $deferred = $.Deferred();
window.setTimeout(function() {
$deferred.resolve();
}, 2000);
return $deferred.promise();
}
var someArray = [1, 2, 3, 4, 5];
$.queue(someArray, "dfd", $.map(someArray, function(value, index) {
return function(next) {
someFunction(index).then(next)
}
}));
$.dequeue(someArray, "dfd");

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
&#13;
答案 2 :(得分:0)
两种方法都有效:
$.queue(someArray, "dfd", $.map(someArray, function(value, index) {
return function(next) {
someFunction(index).then(next)
}
}));
$.dequeue(someArray, "dfd");
和
someArray.reduce(function(p, item) {
return p.then(function() {
return someFunction(item);
});
}, $.Deferred().resolve()).then(function() {
// all done here
});