我在jQuery网络应用中处理产品的可见/不可见状态(让我们说它是"完整的汽车")。
当用户选择使产品可见/不可见时,我必须列出主要产品的所有子产品(对于"汽车",那些可能是"轮子" ,"刹车",...)。
如果用户选择任何子产品,我必须为每个子产品执行一个Ajax请求,并在其旁边显示响应。
如果所有子产品请求都报告" OK"状态,我必须运行最后一个Ajax请求并对主产品采取行动。如果其中一个子产品请求失败/返回错误,我必须停在那里并且不要在主产品上运行最后一个请求。
我不知道有多少副产品。可能是0,可能是100。
我必须遵循这个流程,我必须对每个子产品使用一个请求,对主要产品使用一个最终请求。
让我们首先关注所有子产品。这是我用来遍历已检查的子产品的片段。
$ads.each(function () {
if($check.prop("checked")) {
$respOk = $(this).find('img.response-ok'); //this point to the img with "response OK"
$respErr = $(this).find('img.response-error');//this point to the img with "response failed"
$.ajax({
type: "POST",
url: "<action_url>",
data: $form.serializeArray(),
success: function(msg) {
if (msg.error == false) {
$respOk.slideDown(); //this lags behind and shows the wrong one!
} else {
$respErr.slideDown(); //this lags behind and shows the wrong one!
}
},
error: function(msg) {
$respErr.slideDown();
},
complete: function(msg) {
$respLoad.stop().slideUp(); //this lags behind and shows the wrong one!
}
});
}//end ad checked
});//end ads loop
问题是:作为非阻塞的Ajax请求,循环立即循环并覆盖$ respOk和$ respErr变量=&gt;当完成/错误触发时,它会评估当前分配的值,并始终在列表的最后一项上显示图像。
在所有ajax请求中使用async:false。这有效,但以不可接受的方式拖延主浏览器线程。
我在辅助函数中移动了ajax请求:
$ads.each(function () {
if($check.prop("checked")) {
helperFunctionWithAjaxRequest(<params..>)
});
}//end ad checked
});//end ads loop
这实际上解决了第一个实现的问题(每个$ respXX引用指向正确的子产品),并且响应正确显示在其子产品旁边。
但现在我遇到了一个不同的问题:就像前一个问题一样,整个循环立即循环,我无法等待所有请求完成并决定它们是否正确(因此解雇了对主要产品的最后一次请求)或者没有(所以停在那里)。
我基本上试图做这样的事情:
$。当(
$ads.each(function () {
if($check.prop("checked")) {
helperFunctionWithAjaxRequest(<params..>)
});
}//end ad checked
});//end ads loop
).then(function() {
//run my code to check if everthing went right (I can already do that)
//if so, run the Ajax request on the main product (I can already do that)
});
但是我真的无法理解要使用的语法(或者当if / then是正确的方法)。
有任何帮助吗?我非常感谢关于&#34;我想做什么的建议&#34;代码路径。