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

时间:2015-02-20 15:32:31

标签: javascript jquery ajax dry

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);
        });
像蟒蛇一样,我不想重复自己10次 我试图创建一个for循环但似乎不可能在$ .when()中编写for循环。

任何想法如何实现这一点?
我在没有结果的地方搜索过。

非常感谢,

3 个答案:

答案 0 :(得分:2)

在你的$。之前定义一个函数应该是什么可能是这样的:

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

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

$.when.apply(this, your_request_array)

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

希望这有帮助

答案 1 :(得分:0)

您可以使用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指令基于此

答案 2 :(得分:0)

将你的承诺放在一个数组中:

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