首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Javascript:在下一次迭代之前等待循环中的函数完成执行

Javascript:在下一次迭代之前等待循环中的函数完成执行
EN

Stack Overflow用户
提问于 2014-06-10 09:26:51
回答 1查看 13.2K关注 0票数 4
代码语言:javascript
复制
$(function() {
$("#submit").click(function() {


for (var i=1; i<=14; i++)
{
        setID(i); 
        checkField(i);

}

if ($('#pass_fail').val() != "fail")
{ 
//do something
}

这就是当我点击注册表的submit按钮时发生的事情。

我想要的执行顺序:

setID(1);

checkField(1);//等待完成

setID(2);

checkField(2);

setId(3);

checkField(3);

……

if语句

我得到的执行顺序:

从i=1到i=14的for循环

if语句

随机顺序的checkField(I)

Problem:$('#pass_fail').val()的默认值为'pass‘。但是,通过循环,checkField(i)可能会将其值更改为“fail”。但由于实际上if语句是在checkField(i)s之前执行的,所以$('#pass_fail')的值总是以'pass‘结束,而'do’总是执行。

在进入looP的下一次迭代之前,我如何等待checkField(i)完成执行?提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-10 09:48:39

从您对问题的描述中,我假设checkField()正在进行某种异步Ajax调用。如果你真的想序列化对checkField()的调用,这样直到第一个调用完成才会进行第二个调用,那么你需要改变代码的结构和流程来实现这一点。两种常见的方法是使用回调来指示触发下一次对checkField()的调用的checkField()调用的完成,或者使用promises来完成类似的操作。

下面是回调机制的一个示例:

代码语言:javascript
复制
$("#submit").click(function() {
    var i = 0;
    function next() {
        i++;
        if (i <= 14) {
            setID(i);
            checkField(i, next);
        } else {
            // all checkField operations are done now
            if ($('#pass_fail').val() != "fail") { 
                //do something
            }
        }
    }
    next();
});

然后,必须修改checkField(),以便在它完成异步操作时调用传递给它的回调。

如果您正在使用jQuery在checkField中进行ajax操作,那么使用jQuery promises也可以相当容易地解决这一问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24131480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档