簡體   English   中英

如果兩個諾言同時解決,這是否可能成為競態條件?

[英]Is this a possible race condition if both promises resolve concurrently?

我有兩個異步操作:

  1. 將通知推送到IOS設備。
  2. 將通知推送到ANDROID設備。 這兩個操作由返回兩個不同承諾的兩個函數完成。 執行這兩個操作的調用函數僅在兩個promise都被解析時才需要返回(為簡單起見,假設這些promise從不被拒絕)。

我已經編寫了以下代碼塊來完成此操作。 解決了“ sendIOSPushNotification”承諾后,我設置了一個標志,指示已觸發IOS通知,並檢查“ sendAndroidPushNotification”是否已解決,如果可以,請從調用函數中解決promise(p)。 同樣,解決“ sendAndroidPushNotification”后,檢查“ sendIOSPushNotification” promise的狀態。

理想情況下,兩個promise中的一個將首先解析,最后一個promises將確保調用函數promise(p)被解析。 如果'sendAndroidPushNotification'和'sendAndroidPushNotification'同時解決,它將在競爭條件下解決嗎?

function sendNotifs() {
let p = Q.defer();
if (iosDeviceTokens.length > 0) {
    self.sendIOSPushNotification(pUnitObj, alertObj, iosDeviceTokens)
        .then(function () {
            iosNotifAttempted = true;
            if (androidNotifAttempted) { //If promise to send push notification to Android is resolved then resolve 'p'
                p.resolve();
            }
        })
}

if (androidDeviceTokens.length > 0) {
    self.sendAndroidPushNotification(pUnitObj, alertObj, androidDeviceTokens)
        .then(function () {
            androidNotifAttempted = true;
            if (iosNotifAttempted) { //If promise to send push notification to IOS is resolved then resolve 'p'
                p.resolve();
            }
        })
}
return p.promise;
}

JS是單線程的。

只要有CPU可用,就可以通過使用事件循環和在同步代碼之間處理異步操作來實現並發性(完全是單腳解釋,僅此而已)。

您的情況會邀請您使用Promise.all() ,它對一組promise進行操作,並且僅在所有promise被解決時才解決,或者在其中一個promise被拒絕時被拒絕。

let promises = [];
promises.push(self.sendIOSPushNotification(pUnitObj, alertObj, iosDeviceTokens));
promises.push(self.sendAndroidPushNotification(pUnitObj, alertObj, androidDeviceTokens));
Promises.all(promises).then( () => { /* your code when both are resolved */ } )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM