【问题标题】:Wait for AJAX to finish before proceeding with the loop?在继续循环之前等待 AJAX 完成?
【发布时间】:2014-04-22 14:21:35
【问题描述】:

为什么每当我将 ajax 放入 for 循环中时,它就不能很好地同步?

例如,我的代码是:

    function addToUserGroupList() {
        _root.qDomId('js-assignGroupArrBtn').disabled = true

        for (var i = 0; i < selectedIds.length; i++) {
            $.ajax({
                type: "POST",
                url: 'groupManage.ashx',
                dataType: 'text',
                data: 'type=getInfo&groupId=' + selectedIds[i],
                success: function (result) {
                    if (result != '') {
                        this.groupName = result.split('&')[0];
                        this.groupNotes = result.split('&')[2];

                        userGroupList.push({ 'uid': parseInt(selectedIds[i]),
                            'name': this.groupName,
                            'adminStr': this.groupNotes
                        });

                        _root.userListObj.gourpInst.gourpTB(userGroupList);
                    }
                },
                error: function (XMLHttpRequest, status, errorThrown) {
                    alert('failed to add to user\'s group.');
                }
            });
        }

        _root.qDomId('js-assignGroupArrBtn').disabled = false;
        selectedIds = [];
    }

为什么它在 Ajax 查询之前首先调用 selectedIds = [];? 是否可以在处理 selectedIds = []; 之前完成 ajax 查询?因为它在完成这些工作之前就清除了数组。 :/

【问题讨论】:

  • 任何你想在ajax调用完成后运行的代码都应该在成功回调函数中

标签: javascript jquery ajax


【解决方案1】:

首先,您确实需要了解 Ajax 调用是如何异步的(这就是 Ajax 中“A”的含义)。这意味着调用$.ajax() 只会启动ajax 调用(它将请求发送到服务器),其余代码会愉快地继续运行。有时,在执行完其余代码之后,当响应从服务器返回时,会调用成功或错误回调处理程序。这不是顺序编程,必须以不同的方式处理。

这意味着#1 事情是您希望在 ajax 调用之后发生的任何事情都必须在成功或错误处理程序中或从那里调用。位于 ajax 调用之后的代码将在 ajax 调用完成之前运行很久。


因此,有不同的方法来构建您的代码以使用此异步概念。如果您一次只需要一个异步 ajax 调用,则必须进行此重组,并且不能使用简单的 for 循环。相反,您可以创建一个索引变量并在完成函数中增加索引并开始下一次迭代。这是一种编码方式:

function addToUserGroupList() {
    _root.qDomId('js-assignGroupArrBtn').disabled = true

    var i = 0;
    function next() {
        if (i < selectIds.length) {
            $.ajax({
                type: "POST",
                url: 'groupManage.ashx',
                dataType: 'text',
                data: 'type=getInfo&groupId=' + selectedIds[i],
                success: function (result) {
                    i++;
                    if (result != '') {
                        this.groupName = result.split('&')[0];
                        this.groupNotes = result.split('&')[2];

                        userGroupList.push({ 'uid': parseInt(selectedIds[i]),
                            'name': this.groupName,
                            'adminStr': this.groupNotes
                        });

                        _root.userListObj.gourpInst.gourpTB(userGroupList);
                    }
                    next();
                },
                error: function (XMLHttpRequest, status, errorThrown) {
                    alert('failed to add to user\'s group.');
                }
            });
        } else {
            // last one done
            _root.qDomId('js-assignGroupArrBtn').disabled = false;
            selectedIds = [];
        }
    }
    // kick off the first one
    next();
}

【讨论】:

  • 我明白了.. 所以这就是为什么它不能很好地与简单循环同步。令人惊讶的是,它实际上可以被一个函数包装并重复调用自身,直到满足条件。这很好用,谢谢!
猜你喜欢
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多