使用异步操作转换for循环

时间:2016-11-01 13:18:16

标签: javascript asynchronous

我有一系列对象,当用户点击按钮时,我需要执行以下操作:

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循环?

有谁能告诉我如何做到这一点?

谢谢。

1 个答案:

答案 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);
          }
        });
      });
  }
}