我正在尝试运行以下代码。
我得到的结果是,如果控件进入循环内的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
}
});
}
}
答案 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();
});
我知道它看起来与您的代码略有不同,但我认为它也清晰可读。
逻辑是:在调用新的响应之前,必须等待异步响应。所以这里的循环无效。你需要一个在需要时调用自身的方法(递归)。
这是一个动态写的示例,因此您可能需要进行更改才能使其正常工作。