理論: 我有約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);`
問: 問題是可以這樣的比賽條件下的理論上面打描述?如果不是,這個理論又有什麼缺陷? 如果是,跟蹤承諾解決進度的好方法是什麼?
您發佈的代碼似乎有效。你能否像你在實際的代碼中描述的那樣產生一種情況,所以我們可以測試它? – raduation
此外,我沒有看到任何代碼在遞增之前檢查'progress.counter'的值,所以我沒有看到這種競爭情況會如何發生。 – raduation
JavaScript是單線程的,因此兩段代碼不能同時執行。即使它是線程化的,「+ ='是一個單獨的操作,所以無論如何都不會改變變量的值。 – JJJ