当前位置: 首页 > 面试题库 >

等待AJAX​​完成后再继续循环吗?

平羽
2023-03-14
问题内容

为什么每当我将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 = [];
    }

为什么它先调用selectedIds = [];Ajax查询?是否有可能让ajax查询在继续之前完成selectedIds = [];?因为它在完成填充之前就清除了数组。:/


问题答案:

首先,您确实需要了解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();
}


 类似资料:
  • 有什么想法吗?没有JS库。 编辑:我做了几次回拨尝试。老实说,我很难理解他们。下面是我的最后一次尝试:

  • 问题内容: 我过去一直在努力,今天一直在努力的事情是阻止API / AJAX继续进行,直到您收到响应为止。目前,我正在使用Facebook API。我需要从调用中获取响应,然后将其返回,但是正在发生的事情是,在我从未从API调用中获取响应之前,我的函数正在返回。我知道为什么会这样,我只是想不出如何预防!这是我的代码… // -----编辑 我注意到有人建议这样的事情… 但这返回未定义 //根据更新

  • 问题内容: 怎么可能 等到动作完成后再继续循环,我不能得到$ this var,因为它具有最后一个值,对不起我的英语,谢谢!!! 问题答案: 选项1:切换到处理程序中数组中的下一个元素。 选项2:同步发出Ajax请求: 全球: 或直接在请求中: });

  • 问题内容: 我的document.ready()中有一些ajax调用 喜欢 : 我如何强制它等待,直到我们从ajax请求获得所有回叫之前不继续? 问题答案: 我根本不喜欢任何答案,最好的方法(自Jquery 1.5+起)是使用Deferred对象,这些是操纵异步调用的对象,可以解决: 这样,myFunc会在执行2个ajax调用之后执行,如果其中一个出错,则执行myFailure。 您可以在jque

  • 我正在使用JavaScript处理图像。对于每个图像,我使用.toblob创建4个文件。问题在于.toblob是异步的,这样一个.toblob进程可以在其他进程完成时运行。await异步似乎不起作用。处理的图像数的计数器似乎不起作用,因为上一个图像可以处理,而前一个图像尚未完成。最后一个图像将计数器增加到图像数并触发保存。 我可以在最后一个图像上做一个setTimeout,但那只是在猜测最大时间。

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