1
我有一個應用程序,通過OAuth 2.0協議與雲服務進行身份驗證。我使用第三方庫進行HTTP請求,並將呼叫打包到Promise
。我也確保這個電話可以超時。代碼基本如下所示:
var authenticate = new Promise (resolve, reject) {
service.authenticate(callback); // The third party library HTTP request
if (responseData === 'authenticated') {
resolve();
} else {
reject();
}
}
var timeout = new Promise (resolve, reject) {
setTimout (function() {reject();}, 2000}
}
Promise.race([authenticate, timeout])
.then(resolved)
.catch(rejected);
如果前一個被拒絕,應用程序會立即進行新的身份驗證嘗試。這意味着一個新的Promise
立即被分配到var authenticate
。這意味着前Promise
分配給authenticate
垃圾收集(我猜 - 請糾正我,如果我錯了)。
問題
如果雲服務與關係的訪問令牌收集Promise
垃圾迴應,會發生什麼?
感謝您的回覆。 *第一:*'service.authenticate'只是一個代表在第三方圖書館打電話的簡化方式。所以沒有決心或拒絕需要傳遞給它。 *第二:*「承諾不是垃圾收集」。 'foo = new Promise(function(resolve,reject){}','typeof foo ==='object'); // true'。正如你所看到的Promise是一個被變量foo引用的對象。 – rabbitco
因此,如果刪除了引用,Promise對象將實現引用計數和標記和掃描算法以進行垃圾收集。我很難理解爲什麼這些算法不適用於Promise對象。你能詳細說明一下嗎? – rabbitco
函數'resolve'和'reject'仍然引用promise。如果你可以在JavaScript中像這樣跳過它,它不會被垃圾回收。 – jib