无法按顺序执行循环

时间:2015-06-23 09:49:15

标签: jquery

我正在尝试运行以下代码。

我得到的结果是,如果控件进入循环内的when条件,则不会执行if调用。此外,我无法在最后一次迭代期间在第二个if条件下进行ajax调用。

如何顺序执行?

    for (var i = 0; i < myBoxList.length; i++) {

        console.log('for loop: '+i);

        if (myBoxList[i].isChecked == true) {

            checkedProjectList.push(myBoxList[i]);
            console.log('Inside When : '+i);

            $.when(generateXMLforSelectedProject(myBoxList[i])).then(function (XML) {

                ProjectDataXML += XML;
                console.log('Inside When : '+i);
                if (i == myBoxList.length - 1) {
                   // execution complete
                   // perform ajax call
                }


            });

        }


    }

1 个答案:

答案 0 :(得分:2)

我认为这是因为您正在使用循环和异步调用,因此循环不会等待ajax响应。你必须改变逻辑。请参阅我使用您的代码制作的示例:

var Program = {

    Init: function(){
        this.Elems = myBoxList;
        this.CheckedProjectList = [];
        this.Counter = 0;
        this.DoJob();
    },

    DoJob: function(){
        if( this.Counter == this.Elems.length ) return;

        if( !this.Elems[this.Counter].isChecked ){
            this.Counter++;
            this.DoJob();
            return;
        }

        this.CheckedProjectList.push(this.Elems[this.Counter]);
        console.log('Inside When : ' + this.Counter);

        $.when(generateXMLforSelectedProject(myBoxList[i])).then(function (XML) {

            ProjectDataXML += XML;
            console.log('Inside When : '+i);
            if (Program.Counter == Program.Elems.length) {
                // execution complete
                // perform ajax call

                // when ajax succeeds....
                Program.Counter++;
                Program.DoJob();
            }

        });
    }

};

$(function(){
    Program.Init();
});

我知道它看起来与您的代码略有不同,但我认为它也清晰可读。

逻辑是:在调用新的响应之前,必须等待异步响应。所以这里的循环无效。你需要一个在需要时调用自身的方法(递归)。

这是一个动态写的示例,因此您可能需要进行更改才能使其正常工作。