Javascript 如何使for循环在异步调用成功后再继续
您好,我正在使用for循环和异步ajax调用为本地存储创建批处理更新 我的问题是,即使我的ajax调用还没有成功完成,我的循环仍在继续 在继续循环之前,我们如何使for循环等待单元成为ajax响应的响应 感谢您的帮助。谢谢 下面是我的示例代码:Javascript 如何使for循环在异步调用成功后再继续,javascript,ajax,sencha-touch,Javascript,Ajax,Sencha Touch,您好,我正在使用for循环和异步ajax调用为本地存储创建批处理更新 我的问题是,即使我的ajax调用还没有成功完成,我的循环仍在继续 在继续循环之前,我们如何使for循环等待单元成为ajax响应的响应 感谢您的帮助。谢谢 下面是我的示例代码: var counter =0; var totalRow = 3000; for (var i = 0, l = totalRow; counter <= l; i++) { var defectssurl = 'https://test
var counter =0;
var totalRow = 3000;
for (var i = 0, l = totalRow; counter <= l; i++) {
var defectssurl = 'https://test.com/mywcf.svc/GetListAllPaging?id=' + counter;
Ext.Ajax.request({
url: defectssurl,
method: "POST",
params: '',
success: function (resp) {
console.log("load first 500 records");
var data = Ext.JSON.decode(resp.responseText); //encode Json List
if (counter == 0) {
defectsLocalStore.getProxy().clear();
// Also remove all existing records from store before adding
defectsLocalStore.removeAll();
}
Ext.Array.each(data, function (record) {
counter = counter + 1;
defectsLocalStore.add(record);
});
defectsLocalStore.sync(); // The magic! This command persists the records in the store to the browsers localStorage
//records is now same as the total records
if (counter >= totalRow) {
pCallback();
}
//continue loop
},
headers: {
'Content-Type': 'application/json; charset=utf-8'
},
failure: function (resp) {
}
});
}
var计数器=0;
var totalRow=3000;
对于(变量i=0,l=totalRow;计数器=totalRow){
pCallback();
}
//继续循环
},
标题:{
“内容类型”:“应用程序/json;字符集=utf-8”
},
故障:功能(resp){
}
});
}
请不要使用“for循环”。相反,在成功回调中,增加计数器并重新触发自身。像下面这样
function mySyncFunction (counter, totRecords){
if(counter === undefined)
counter = 0;
if(counter >=totRecords) return;
var defectssurl = 'https://test.com/mywcf.svc/GetListAllPaging?id=' + counter;
Ext.Ajax.request({
url:defectssurl,
// snip // your code here
success: function (resp) {
// snip // your code here
counter++;
mySyncFunction(counter, totRecords);
}
// snip // your code here
});
循环不能等待任何异步操作,因为Javascript是单线程的。异步更新只有在循环完成并返回到主事件循环后才会发生。不要在循环中执行异步更新,而是让row
i
的success
函数发送对rowi+1
的AJAX请求。您可以尝试使用承诺。不是执行AJAX调用,而是返回一个承诺数组。然后可以使用then
在数组中的所有承诺都完成时执行。如果要一次运行一次ajax调用,就不能使用for
循环。相反,您必须在前一个ajax调用的成功处理程序中启动下一个ajax调用。请参阅今天早些时候发布的示例。请不要推荐async:false
。我从未见过这是实现任何Ajax调用的最佳方式,更糟糕的是,这是实现一系列Ajax调用的最佳方式。它会在ajax调用期间锁定浏览器并阻止用户输入。不推荐使用Async falls,但感谢Abhi,您的逻辑适用于我的:DAgreed。我会选择这个选项。