我有一系列对象,当用户点击按钮时,我需要执行以下操作:
for (var i = 0; i < arrayItems.length; i++) {
var item = arrayItems[i];
$.post(...)
.fail(function(error) {
// Abort the for loop
})
.done(function(data) {
// Do some calculations with the item
...
// Show a dialog box to write some extra data
dialog.open(); // dialog is a Telerik Window widget
});
}
我面临的问题是对话框以异步方式打开(我使用Telerik Window小部件进行对话)所以我需要转换for循环以使进程同步。
另一个问题:如果帖子失败,如何中止for循环?
有谁能告诉我如何做到这一点?
谢谢。
答案 0 :(得分:3)
您可以将循环转换为递归函数,一旦收到当前项的响应,就会为下一个项调用$.post
。如果在任何时候发生故障,您可以通过简单地停止递归来中止。
function fn(items, idx) {
if (idx < items.length) {
$.post(...)
.fail(function(error) {
// Abort the process by not calling `fn` recursively
})
.done(function(data) {
dialog.open();
// call `fn` recursively for the next item
fn(items, idx + 1);
});
}
}
如果你想在对话框关闭后继续下一个项目,我确定你可以使用对话框的onclose
(或类似)钩子,只需在里面调用fn
相反。
function fn(items, idx) {
if (idx < items.length) {
$.post(...)
.fail(function(error) {
// Abort the process by not calling `fn` recursively
})
.done(function(data) {
dialog.open({
onClose: function() {
// call `fn` recursively for the next item
fn(items, idx + 1);
}
});
});
}
}