将异步Ajax调用结果放入数组中

时间:2016-02-24 10:51:43

标签: javascript jquery ajax asynchronous

我的代码:

    var test = getData(email, password, data.sites);
    console.log(test);  // 4 sites, 4 responses

// TODO if 4 responses, call other function

function getData(email, password, sites) {
    var formData = createFormDataArray(email, password, 0);     // not so relevant

    var returnValues = [];

    sites.forEach(function (site) {
        var url = 'http://' + site + '/test.php';
        var newValue;
        sendRequest(url, formData).done(function(value) {
            newValue = value.status;    // string
            console.log(newValue);
        });
        returnValues.push(newValue);    // add to array
    });

    console.log('------');
    console.log(returnValues); // print array
    return returnValues;
}

function sendRequest(url, formData) {
    return $.ajax({
        type: 'post',
        url: url,
        data: formData,
        crossDomain: true,
        dataType: 'json',
        encode: true
    });
}

我想在这里做的是对不同的域进行多次Ajax调用,将结果放在一个数组中。

如果数组包含所有回复,我想调用另一个功能,我现在还没有。

这里的问题是:电话是异步的,我喜欢等待'直到我收到所有回复,以便我可以启动另一个功能。

目前已记录:

  • 空数组
  • 空数组
  • newValue:" Ok"

我需要什么:

  • newValue:" Ok"

  • [" Ok"," Ok"," Ok"," Ok"]

  • [" Ok"," Ok"," Ok"," Ok"]

或类似的东西。 怎么办呢?

**编辑:我的解决方案:**

var defers = [];
sites.forEach(function (site) {
    var url = 'http://' + site + '/test.php';
    var defer = sendRequest(url, formData);

    defers.push(defer);
});

$.when.apply(window, defers).always(function() {
    // the other function
});

创建一系列推迟'。然后,使用以下答案中的解决方案。

1 个答案:

答案 0 :(得分:1)

你可以使用jQuery.when()进行多次ajax调用,并在完成所有xhr调用后执行一些函数。

$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) {
  // a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively.
  // Each argument is an array with the following structure: [ data, statusText, jqXHR ]
  var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It"
  if ( /Whip It/.test( data ) ) {
    alert( "We got what we came for!" );
  }
});

可以找到更多详细信息here

使用$ .when()和for循环,

var returnValues = [];
var deferreds = [];
sites.forEach(function (site) {
        var url = 'http://' + site + '/test.php';
        deferreds.push(sendRequest(url, formData));
    });

$.when.apply($, deferreds).done(function(){
    for(var i=0; i<arguments.length; i++)
    {
        returnValues.push(arguments[i].status); 
    }
});