2015-08-27 65 views
1

理論: 我有約100個承諾,我在開始做,然後使用Promise.all()解決它們。Promise的進展

這100個promise中的每一個反過來都會產生一些異步REST調用,這些調用的響應可能主要有所不同(例如,由於網絡連接)。

解決所有100個承諾的過程大約需要20秒。在此期間,用戶應該獲得現場反饋,以保持他的參與。

爲了實現這些異步操作的進度,我正在考慮在客戶端使用progressCounter,它的值將在解析後立即由每個promise更新。

問題是,如果progressCounter = 1並且所有這些操作都是異步的,我擔心會遇到競爭條件,例如,可能會發現兩個不同承諾檢索的progressCounter的當前值可能相同,即1嘗試增加progressCounter到相同的值即2。因此,由於競爭條件,最終值不會是3。

實驗: 我試圖重現這個理論,但不能使用下列內容:

var progress = {}; 
progress.counter = 1; 

var promise1 = new Promise(function(resolve, reject) { 
    resolve(); 
}); 

var promise2 = new Promise(function(resolve, reject) { 
    resolve(); 
}); 

promise1.then(function() { 
    progress.counter += 1; 
}); 

promise2.then(function() { 
    progress.counter += 1; 
}); 

setTimeout(function() { 
    alert(progress.counter); // progress.counter: 3 
}, 1000);` 

問: 問題是可以這樣的比賽條件下的理論上面打描述?如果不是,這個理論又有什麼缺陷? 如果是,跟蹤承諾解決進度的好方法是什麼?

+0

您發佈的代碼似乎有效。你能否像你在實際的代碼中描述的那樣產生一種情況,所以我們可以測試它? – raduation

+0

此外,我沒有看到任何代碼在遞增之前檢查'progress.counter'的值,所以我沒有看到這種競爭情況會如何發生。 – raduation

+5

JavaScript是單線程的,因此兩段代碼不能同時執行。即使它是線程化的,「+ ='是一個單獨的操作,所以無論如何都不會改變變量的值。 – JJJ

回答

6

問題:問題是這樣的競爭條件是否可以在上述原理中描述?如果不是,這個理論又有什麼缺陷?

答案是沒有,不能出現在Javascript中這樣的競爭狀態,因爲JavaScript是單線程的。 (見:Concurrency Model and Event Loop上MDN)

這意味着,當一個回調處理程序正在與數據(假設設置計數器是同步操作,這+ =是),沒有什麼能迫使它「產量」它的執行,下一個處理程序只能在前一個處理程序完成時運行。