2016-01-20 43 views
0

我需要延遲每個Ajax調用,直到前一個函數(hashcode.Sign())完成。不幸的是,我的代碼不會等到hashcode.Sign()完成並且將所有東西混淆,因爲該函數會創建一個新的會話,並且它不能被覆蓋以便工作起作用。我應該怎麼做?我對延期對象很陌生,所以請原諒我缺乏知識。如何排隊jQuery延期對象?

for (var l = 0; l < fileArray.length; l++) { 
     var d = new jQuery.Deferred(); 
     d.resolve(openDdoc(fileArray[l].url, $pid, fileArray[l].id)); 
     d.done(function() { console.log('done'); }); 
    } 

    function openDdoc(url, pid, fid) { 
     var def = new jQuery.Deferred(); 
     $.when(def).done(function() { console.log('Function completed!'); }); 
     def.resolve($.ajax({ 
        url: '/open-ddoc', 
        type: 'post', 
        async: false, 
        data: {doc: url, pid: pid, fid: fid}, 
       }).done(function (data) { 
        hashcode.Sign(); 
       }).fail(function(data) { 
        console.log('this shit failed'); 
       })); 
    } 

hashcode.Sign()函數包含一些更多的Ajax調用和對其他函數的調用。如果需要,我可以在後面加入。我知道我可以用setTimeout()來解決所有這些問題,但那不會是我的第一選擇。

+0

是的,請包括'hashcode.Sign()'。以正確的方式書寫這一點很重要。 –

回答

2

這並不是顯而易見的,但您尋求的順序可以用fileArray().reduce(...)的形式表示。

這個試用和測試的模式在子標題「The Collection Kerfuffle」下概括爲here。 (整篇文章非常值得一讀)。

fileArray.reduce(function(promise, file) { 
    return promise.then(function() { 
     return $.ajax({ 
      url: '/open-ddoc', 
      type: 'post', 
      async: true, // <<<<< always TRUE!! 
      data: {doc: file.url, pid: $pid, fid: file.id} 
     }); 
    }).then(function(data) { 
     console.log(file.id + ': done'); 
     return hashcode.Sign(); // hashcode.Sign() must return a promise 
    }); 
}, $.when()) // <<<<< resolved promise to get the chain started 
.then(function() { 
    console.log('all done'); 
}); 

在此模式中,fileArray每個成員被訪問反過來(同步),加入新鮮.then()到在每次訪問越來越承諾鏈。

已解決的初始承諾$.when()會導致構建的鏈開始建立,並且會按順序進行ajax調用。

ajax調用不需要在一個單獨的函數中,除非它將在別處調用。

應該強調的是hashcode.Sign()(我們知道它是異步的)必須以正確的方式書寫,以便它返回一個有效的承諾。如果不是,那麼在繼續之前,解決過程無法確保其異步完成。

+0

只要指出明顯的,// hashcode.Sign()必須返回promise就可能是這個答案中更重要的一點。如果'hashcode.Sign()'沒有返回一個承諾,那麼除了修復'hashcode.Sign()'返回一個承諾之外,你可以做的不多。 –

+0

@KevinB,謝謝。是的,對你我很明顯,但也許不是OP。現在我添加了一個腳註。當OP響應我對'hashcode.Sign()'代碼的請求時,我將能夠進行適當的編輯。如果您先到達那裏,請隨時編輯我的答案。 –

+0

感謝您的回覆。我添加了[相應的功能PasteBin](http://pastebin.com/dZS9BTED)供您查看。目前我必須承認,這不是答應。 – jeesus