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

Javascript 将异步Ajax调用结果放入数组中,javascript,jquery,ajax,asynchronous,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

我的代码:

    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:“好的”
我需要的是:

  • newValue:“好的”


  • [“好”、“好”、“好”、“好”]

  • [“好”、“好”、“好”、“好”]
或者类似的事情。 如何做到这一点

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

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
});
创建一个“延迟”数组。然后,使用下面答案中的解决方案

您可以使用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!" );
  }
});
更多细节可以找到

要将$.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); 
    }
});
var returnValues=[];
风险值递延=[];
站点。forEach(功能(站点){
var url='http://'+site+'/test.php';
推送(sendRequest(url、formData));
});
$.when.apply($,延迟).done(函数(){

对于(var i=0;i可能的重复项,您无法返回该数组,您必须添加一个在
.done
方法中调用的回调。此外,在AJAX调用之后要发生的所有代码都必须添加到AJAX调用本身的成功回调(done函数)中否则,它将在AJAX调用之前发生。我知道之后的所有代码都应该在成功回调中,但我喜欢收集多个调用的响应。好的,这间接地让我找到了解决方案。请尽快更新我的帖子。@dnns,您可以使用with loop,请查看我对您的场景的其他回答。是的,谢谢,实际上找到了alr我已经准备好了。检查我的编辑。