2016-07-22 215 views
1

我試圖用jQuery來編寫一些JavaScript代碼,它依次執行一些異步事件(在一個循環中);只有在之前的異步事件完成後才迭代。jQuery按順序執行異步事件

的基本思路是:

for (var i = 0; i < someLength; i++) { 
    // 1. dynamically add a <form> and <input>s to the DOM 
    // 2. submit the form to a target <iframe> 
    // 3. wait for an async callback indicating the form has been submitted 
} 

我已經工作了#1和#2的代碼,我可以附加一個load事件偵聽器知道當表單提交已完成:

$('.iframe').on('load', function() { ... 
}); 

for (var i = 0; i < someLength; i++) { 
    // 1. dynamically add a <form> and <input>s in the DOM 
    // 2. submit the form to a target <iframe> 
    // 3. wait for an async callback indicating the form has been submitted 
} 

問題是我不知道如何將ready回調與循環邏輯聯繫起來。我試圖研究延期/承諾,但並沒有真正看到如何在這裏正確應用這些概念。

如果答案是使用承諾,那麼我也希望看到如何合併一些代碼以在循環進行時顯示「加載」微調器,然後在我們退出循環時刪除微調器。

謝謝!

回答

2

For-loop厭惡異步操作。解決方案可能如下所示。

$('.iframe').on('load', function() { ... 
    // increment i 
    //if(i >= someLength) exit 
    // 1. dynamically add a <form> and <input>s in the DOM 
    // 2. submit the form to a target <iframe> 
}); 

//for (var i = 0; i < someLength; i++) {//no loop 
//} 
    // 1. dynamically add a <form> and <input>s in the DOM 
    // 2. submit the form to a target <iframe> 
    // 3. nothing to wait 
+0

謝謝@Alex。所以在這個解決方案中,我基本上排隊了所有提交,然後等待'load'回調觸發'someLength'多少次?如果我只想在下一次提交時如果前一次成功(假設我有辦法知道它是成功還是失敗),該怎麼辦? –

+0

在'.load'處理程序中,您可以檢查當前狀態並決定下一步該做什麼。 –

+0

沒錯,但我認爲在你的代碼中,所有的提交請求都會在'for'循環中被啓動/排隊,並且當一個請求結束時,'load'處理程序將被回調。有了這個方案,如果前一個失敗,你不能阻止下一個提交的執行,或者我錯過了什麼? –

2

我想你可以用遞歸的方式來代替for循環。像特別是如果你想他們這個 -

$("#imgSpinner").show(); 
someFunction(0,someLength); 

function someFunction(currentSeq,totalIterations) 
{ 
    $.ajax({ 
      url: URL, 
      type: 'POST', 
      contentType: 'application/json; charset=utf-8', 
      success: function (result) { 
        if (currentSeq<totalIterations) 
         someFunction(currentSeq++,totalIterations); 
        else 
         $("#imgSpinner").hide(); 
      }, 
      error: function (error) { 
       //handle error 

      } 
    }); 

} 
+1

謝謝,但我不能使用'$ .ajax',因爲我發佈到不同的域。理想情況下,我想要一個仍然實現承諾/延期的解決方案,因爲我想通過示例學習如何正確使用它們。 –

0

我想了解如何有一個for-loop創建表單和字段......所有你的表單都包含相同的字段嗎?即多個電子郵件地址或什麼?

如果不理解設計,我會以此爲例提交一些數據,然後提交下一個數據。

$.when(AjaxSubmitFirstData.call()).done(function (data) { 
    $.when(AjaxSubmitSecondData.call()).done(function (data) { 
    // finished 
    }); 
}); 

var AjaxSubmitFirstData = { 
    call: function() { 
    return $.ajax({ 
     url: url, 
     type: 'POST', 
     data: "{}", 
     contentType: 'application/json; charset=utf-8', 
    }).done(function (data) { 
    }).fail(function (jq, textStatus) { 
    }); 
    } 
}; 

var AjaxSubmitSecondData = { 
    call: function() { 
    return $.ajax({ 
     url: url, 
     type: 'POST', 
     data: "{}", 
     contentType: 'application/json; charset=utf-8', 
    }).done(function (data) { 
    }).fail(function (jq, textStatus) { 
    }); 
    } 
}; 
+0

謝謝。我需要創建多個表單的原因是因爲我將多個POST發送到不同的域(每個請求中具有不同的數據),因此無法使用AJAX(因爲具有相同的源策略)。你是否可以修改你的答案以顯示如何在不使用'$ .ajax'時使用延遲? –