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

时间:2014-06-10 01:26:51

标签: javascript jquery for-loop asynchronous callback

$(function() {
$("#submit").click(function() {


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

}

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

当我点击注册表单的提交按钮时会发生这种情况。

我想要的执行顺序:


SETID(1);
校验场(1); //等待这个结束
SETID(2);
校验场(2);
SETID(3);
校验场(3);
....
如果声明

我得到的执行顺序:


for循环从i = 1到i = 14 如果声明
checkField(i)以随机顺序

问题:$(&#39; #pass_fail&#39;)。val()的默认值为&#39; pass&#39;。但是通过循环checkField(i)可能会将其值更改为&#39; fail&#39;。但实际上,if语句在checkField(i)之前执行,$(&#39; #pass_fail&#39;)的值总是最终被传递掉#39;并且做了些什么&#39;总是执行。

如何在继续执行looP的下一次迭代之前等待checkField(i)完成执行?提前谢谢!

2 个答案:

答案 0 :(得分:2)

我假设您对问题的描述checkField()正在进行某种异步Ajax调用。如果您确实要将对checkField()的调用序列化,那么在第一次调用完成之前不会进行第二次调用,那么您需要更改代码的结构和流程才能执行此操作。这样做的两种常见方法是使用一个回调来指示完成对checkField()的调用,该回调触发对checkField()的下一次调用,或者使用promises来完成类似的事情。

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

$("#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来解决这个问题也相当容易。

答案 1 :(得分:0)

对不起,但是在较早的响应中,我没有看到任何循环等待任何其他函数或任何内部循环执行以使其在下一次迭代之前完成。

使用 mov es, ax

场景: 与mov ss, ax一起使用的JQuery 3.3.1将在其他内部循环完成之前,等待for loop的下一个迭代值

var i
i

希望这对很多人有帮助。