当前位置: 首页 > 知识库问答 >
问题:

如何使for循环在异步调用成功后再继续

戚学
2023-03-14

您好,我正在使用for循环和异步ajax调用为本地存储创建批处理更新。

我的问题是,即使我的ajax调用还没有成功完成,我的循环仍在继续。

在继续循环之前,我们如何使for循环等待单元成为ajax响应的响应?

任何帮助都很感激。谢谢!!!

下面是我的示例代码:

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) {

        }
    });

}

共有1个答案

倪德业
2023-03-14

请不要使用“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
});
 类似资料:
  • 问题内容: 嗨,我正在使用for循环和异步ajax调用为本地存储创建批处理更新。 我的问题是,即使我的ajax调用仍未成功完成,我的循环仍会继续。 在继续循环之前,我们如何设法使循环等待单元响应ajax响应? 任何帮助表示赞赏。谢谢!!! 下面是我的示例代码: 问题答案: 请不要使用“ for循环”。而是在成功回调中增加计数器并重新触发自身。像下面这样。

  • 问题内容: 我如何访问传递给fs.lstat函数的变量? 问题答案: 这是使用而不是for循环迭代值的完美理由。 另外,您可以使用@Aadit建议的闭包:

  • 问题内容: 我想在异步for循环遍历Javascript对象的值完成执行后调用一个函数。我有以下代码 问题答案: 这可以在普通JS中完成,但是我建议使用模块,它是用于处理Node.js中异步代码的最流行的库。例如,使用: 如果要使用每次迭代的结果,则类似,但是将结果数组传递给回调的第二个参数。 如果您喜欢香草JS,则可以代替: (摘自我前段时间写的要点) 我强烈建议您使用异步库。异步很容易编写,类

  • 问题内容: 我在NodeJS中有一个forEach循环,遍历一系列键,然后从Redis异步检索其值。循环和检索完成后,我想返回该数据集作为响应。 我目前的问题是因为数据检索是异步的,发送响应时没有填充我的数组。 如何在我的forEach循环中使用promise或回调,以确保响应与数据一起发送? 问题答案: 我在这里使用Bluebird Promise 。请注意,代码的意图非常清晰并且没有嵌套。 首

  • 问题内容: 列表中的每封电子邮件都将发送到服务器,并从服务器获得响应(如果它是有效的电子邮件)。 因此,在检查完所有电子邮件之后,数组应具有: 循环发送电子邮件到服务器的代码如下: 但是问题在于调用是异步的,因此,假设i = 0,则当i为0时控件将不会进入函数。因此,当i进入函数时,i的值可以是任何值,通常大于数组的长度,因此isEmailValidList [i]未定义。如果呼叫是同步的,则它将

  • 问题内容: 为什么每当我将ajax放入for循环中时,它都无法很好地同步? 例如,我的代码是: 为什么它先调用Ajax查询?是否有可能让ajax查询在继续之前完成?因为它在完成填充之前就清除了数组。:/ 问题答案: 首先,您确实需要了解Ajax调用是如何异步的(这就是Ajax中的“ A”所代表的意思)。这意味着调用仅启动ajax调用(它将请求发送到服务器),其余代码愉快地继续运行。有时,在其余代码