按顺序收集AJAX结果

时间:2016-08-03 13:21:10

标签: javascript jquery arrays ajax

我有一个值数组(myarray),我想迭代并在每次迭代时运行一个AJAX请求。我已将每个ajax请求放在另一个数组(requests)中,这样我就可以在所有AJAX请求完成后调用alert

像这样:

var requests = [];
for (i = 0; i < myarray.length; ++i) {
    requests.push($.ajax({
        url: 'anotherurl?=' + myarray[i],
        dataType: "JSONP",
        success: function (data) {
          array_of_results.push(data);
        }
    }));
}
$.when.apply($, requests).done(function() {
    alert('complete');
});

所有结果都收集在array_of_results中。但是由于AJAX请求需要不同的时间来完成,因此该数组不会按原始顺序生成结果。

有没有办法订购这个阵列?

我希望我有道理。我很欣赏这是非常令人费解的。

5 个答案:

答案 0 :(得分:7)

您是否尝试过以下操作?我认为这应该有效。所有回复都应该按顺序在when()的成功函数中提供。

var requests = [];
for (i = 0; i < myarray.length; ++i) {
    requests.push($.ajax({
        url: 'anotherurl?=' + myarray[i],
        dataType: "JSONP"
    }));
}
$.when.apply($, requests).done(function() {
    array_of_results = arguments;
    alert('complete');
});

答案 1 :(得分:1)

考虑使用递归而不是使用循环。这是一个完整的例子:

var myArray = [
    "somevalue",
    "some other value",
    "another value"
];
var i = myArray.length;
var responses = [];

function doRequests(){
    i--;
    $.ajax({
        url: "myurl.php",
        data: {paramname: myArray[i]}
    }).done(function(response){
        responses.push(response);
        if(i>0) doRequests();
        else{
            // all requests sent.. do stuff
            // responses array is in order
            console.log(responses);
            alert("all done!");
        }
    });
}

答案 2 :(得分:1)

您可以为PF对象添加自定义属性,设置为$.ajax var。

i

JavaScript真的很有用,如果你将一个值归入一个超出其边界的数组(大于0),那么数组的大小将被自动设置为正确的数量。

答案 3 :(得分:-1)

如何使用异步设置的jquery.ajax调用为false。这样,reaponse将按要求按顺序排列......

答案 4 :(得分:-1)

以@Christo的答案为基础 - 使用数组映射函数

var array_of_results = [];
var requests = myarray.map(function(item, index) {
    return $.ajax({
        url: 'anotherurl?=' + item,
        dataType: "JSONP",
        success: function (data) {
            array_of_results[index] = data;
        }
    }
});

...