我确信这个问题以前已经被问过很多次了,但这不是典型的异步 JS 问题“如何仅在另一个函数完成时调用一个函数?”。
所以我的场景如下:我需要使用 AJAX 加载大量数据,这是按比赛周数排列的比赛列表。我设置了一系列 Promise,当它们全部完成后,一旦我在 DOM 中获得了所有匹配项,我就会做其他事情。我有这样的事情:
var promises = [];
for (var i = 1; var i <= lastWeek; i++)
promises.push($.ajax({
url: "week/" + i,
success: { ... }
}));
$.when.apply($, promises).done(someFunction);
但是我注意到这会立即触发所有请求,并且可能会阻塞服务器端的进程并导致一般故障。所以我想我会以不同的方式处理这个问题,而不是一次提出所有这些请求,我在第一周提出一个,一旦完成,我提出以下要求,依此类推:
function loadWeek(week, last) {
$.get("week/" + i, function (response) {
// do whatever with the response
// make the request for the next week
if (week + 1 <= last)
loadWeek(week + 1, last);
});
}
现在我当然不能使用 $.when
因为 promise 是在前一个 promise 完成时动态生成的。
我想知道 JS 或 jQuery 是否有一种方法可以在加载上周后向 someFunction
函数(仅应在加载所有匹配项后调用的函数)发出信号。
当然,你可以说,只要在 week + 1 > last
时调用它,对吗?好吧,我仍然需要使用 Promise,因为这个 someFunction
不仅需要等待这些匹配项加载,还需要等待另一个 Promise 完成。
所以当我说我这样做时,你可以说我撒了一点谎:
$.when.apply($, promises).done(someFunction);
实际上,promises
实际上除了匹配列表之外还有更多的函数调用,并且 someFunction
应该有,直到全部完成了。
最佳答案
好吧,让我们分解一下,如果我理解正确的话,你想要以下内容
A- 连续加载周
function loadWeek(week, last) {
var deferred = $.Deferred();
(function request(week, last) {
$.get("week/" + i, function (response) {
// do whatever with the response
// make the request for the next week
if (week + 1 <= last)
request(week + 1, last);
else
deferred.resolve();
});
})(week, last);
return deferred.promise();
}
B- 同时加载其他内容
function otherStuff() {
// return some promise
}
C- 当 A 和 B 完成时调用 someFunction
var promises = []
promises.push(loadWeek(1, 10));
promises.push(otherStuff(...));
$.when.apply($, promises).done(someFunction);
关于javascript - 当最后一个完成时调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41383704/