javascript - 当最后一个完成时调用函数

标签 javascript jquery ajax

我确信这个问题以前已经被问过很多次了,但这不是典型的异步 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/

相关文章:

javascript - 使用 jQuery 确定元素的类

jQuery 从服务器获取图像并显示为弹出窗口

php - 如何根据另一个文本框的值使用 jQuery 自动完成文本框

javascript - 如何触发使用 Ajax 动态创建的元素上的指令?

php - 客户端ajax从服务器更新而无需每秒重复代码?

javascript - AngularJS:防止验证隐藏的表单字段

javascript - AngularJs 中的单例 Controller

javascript - Angular Material 菜单在移动设备中触发点击事件 2 次

javascript - DJANGO 使用 ajax 在基本模板中加载/包含模板

javascript - 如何操作位于状态并显示到页面的数据?