多次循环 ajax 请求,一次回调

Multiple looped ajax requests with one callback

this article 一样,我有几个 ajax 请求要执行,然后是 1 个操作。
然而,不同的是,我所有的 ajax 请求仅相差一个增量参数,如下所示:

        $.when(
            // ajax requests
            // 1
            $.ajax({
                url:"https://www.aaaaaaa.com?param="+0,
                crossDomain: true,
                dataType: "jsonp",
                success: function (response) {
                    data = data.concat(response);
                }
            }),
            // 2
            $.ajax({
                url:"https://www.aaaaaaa.com?param="+2500,
                crossDomain: true,
                dataType: "jsonp",
                success: function (response) {
                    data = data.concat(response);
                }
            }),
            // 3
            $.ajax({
                url:"https://www.aaaaaaa.com?param="+5000,
                crossDomain: true,
                dataType: "jsonp",
                success: function (response) {
                    data = data.concat(response);
                }
            })
            // etc. ~10 times

        ).then(function() {
            // action
            console.log(data);
        });

喜欢python我不喜欢重复10次
我试图制作一个 for 循环,但似乎无法在 $.when() 中编写 for 循环。

有什么实现方法吗?
我到处搜索都没有结果。

非常感谢,

您可以使用 Kriskowal 的 q 实现:https://github.com/kriskowal/q

有一种方法Q.allSettled(arrayOfPromises)适合您的需要。

例如:

Q.allSettled(promises)
.then(function (results) {
  results.forEach(function (result) {
      if (result.state === "fulfilled") {
          var value = result.value;
      } else {
          var reason = result.reason;
      }
  });
});

Angular 的 $q 指令基于此

可能应该工作的是在你的 $.when 之前定义一个函数,如下所示:

function createRequest(port) {
     return $.ajax({
         url:"https://www.aaaaaaa.com?param="+port,
         crossDomain: true,
         dataType: "jsonp",
         success: function (response) {
             data = data.concat(response);
         }
     })
}

然后在你的 $.when

中使用它
$.when(createRequest(0), createRequest(2500), createRequest(5000));

如果您想使用更多参数动态创建此函数调用,您可以创建这些请求循环的数组,然后调用 $.when.apply(this, array)

$.when.apply(this, your_request_array)

参见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

希望对您有所帮助

只需将您的承诺放入一个数组中即可:

var promises = [0, 2500, 5000].map(function(n) {
    return $.ajax(...);    // appending `n` to the URL as required
});

然后调用$.when.apply:

$.when.apply($, promises).then(...)

传递给 .then 回调的参数将是单独的数组,每个数组包含单个 $.ajax 回调接收的三个参数。

顺便说一句,您当前的代码将按照调用完成的任何顺序连接数组,不一定按照它们开始的顺序。

如果连接的顺序很重要,你应该使用那些.then函数参数而不是你现有的success处理程序来创建你的data变量:

then(function() {
    var data = [];
    [].forEach.apply(arguments, function(response) {
        data = data.concat(response[0]);
    });
});