带有一个回调的多个循环ajax请求

Multiple looped ajax requests with one callback

本文关键字:循环 ajax 请求 有一个 回调      更新时间:2024-02-07

与本文一样,我要执行几个ajax请求,然后执行一个操作
然而,不同的是,我所有的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);
        });

就像蟒蛇一样,我不喜欢重复自己10次
我试图制作一个for循环,但似乎不可能在$.when().中编写for循环

有什么想法可以实现吗
我到处找都找不到结果。

非常感谢,

可能应该在$.之前定义一个函数

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

然后用在你的$.当

$.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

希望这能帮助

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

有一种方法CCD_ 1适合您的需要。

例如:

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指令基于此

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

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]);
    });
});