【发布时间】:2016-12-29 16:38:09
【问题描述】:
我敢肯定,这个问题之前似乎已经被问过很多次了,但这不是典型的异步 JS 问题“如何仅在另一个函数完成时才调用函数?”。
所以我的场景如下:我需要使用 AJAX 加载一组相当繁重的数据,即按比赛周安排的比赛列表。我设置了一系列承诺,当它们都完成后,一旦我在 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,因为承诺是在前一个完成时动态生成的。
我想知道 JS 或 jQuery 是否提供了一种方法来在上周加载后向someFunction 函数(只有在加载所有匹配项后才应调用的函数)发出信号。
当然,你可以说,只要在week + 1 > last 时调用它,对吗?好吧,我仍然需要使用 Promise,因为这个 someFunction 不仅需要等待这些匹配项被加载,还需要等待另一个 Promise 完成。
所以当我说我这样做时,你可以说我撒了一点谎:
$.when.apply($, promises).done(someFunction);
实际上,promises 实际上除了匹配列表之外还有更多的函数调用,而someFunction 应该有直到所有都完成。
【问题讨论】:
-
也许是 jQuery
.finish(function(){ //do somthing... });? -
你怎么知道他们什么时候完成的?我的意思是,标准是什么?具体长度?
-
@Syntac “全部”是什么意思?如果您在谈论匹配列表,那么当
week大于last并且我们在success块中时,匹配列表就完成了。至于其他人,我们知道他们已经完成,因为这是一个承诺。 -
边问:如果原始版本一次发送所有请求并阻塞服务器,这是由于服务器上的资源限制吗?如果是这样,您是否希望将来有多个用户,即使您确实收到了来自单个用户的请求,他们仍然有能力一次触发一个用户?
标签: javascript jquery ajax