我必须对特定数组执行ajax请求并等待服务器响应,然后再继续循环中的下一次迭代。
我目前同时执行迭代。如何确保成功后才能继续?
感谢您的任何建议。
myArray.each(function(val, index) {
new Ajax.Request(myUrl + val, {
onSuccess: function() {
responseFromServer();
}
});
void(0);
});
答案 0 :(得分:3)
只有在AJAX请求完成后才能进入下一次迭代。我将使用jQuery来展示一个例子;
function sendRequests(requests) {
var value = requests.shift();
$.ajax(myUrl + value).done(function(data){
if (requests.length > 0) {
sendRequests(requests);
}
});
}
sendRequests( [1,2,3,4] );
答案 1 :(得分:2)
可能会像这样尝试
function getItem(url, array, index)
{
new Ajax.Request(url + array[index])
{
onSuccess : function()
{
responseFromServer(); //assuming this handles the server response
if (index < array.length)
getItem(url, array, ++index);
}
}
}
然后只需用
调用它getItem(myUrl, myrray, 0);
基本上,你希望回调在数组中的下一个项目上启动下一个ajaxrequest
答案 2 :(得分:0)
尝试这样的事情。基本上,不是迭代所有元素,而是从数组中取出第一个项,然后发出AJAX请求。然后,当您的请求成功完成后,您将调用下一个项目。
请注意,在此示例中,原始数组已发生变异,在您的情况下可能会也可能不正常。
function invokeAll(myArray)
{
var val = myArray.shift(); //get the next item to be processed
if (!val)
return;
new Ajax.Request(myUrl + val, {
onSuccess: function() {
responseFromServer();
invokeAll(myArray); //got a successful response, start the next one
}
});
}
答案 3 :(得分:0)
您可以为此作业编写一个类,其processNext()函数将处理数组中的所有项目
var arrayProcessor = {
values: [],
process: function(arr) {
arrayProcessor.values = arr;
arrayProcessor.processNext();
},
processNext: function(){
if (arrayProcessor.values.length > 0) {
new Ajax.Request(myUrl + arrayProcessor.values.shift(), {
onSuccess: function() {
responseFromServer();
arrayProcessor.processNext();
}
});
}
},
}