2016-02-22 88 views
1

背景對垃圾回收HTTP請求的HTTP響應會發生什麼?

我有一個應用程序,通過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垃圾迴應,會發生什麼?

回答

0

承諾不是垃圾收集。

注意resolvereject需要傳遞到函數以某種方式做異步認證,否則沒有辦法,他們可以在以後調用,所以讓我們假設它說:

service.authenticate(resolve, reject); 

這是很重要的,因爲爲了完成認證,該功能顯然需要保持功能resolvereject,而該功能又保持返回的承諾存活,而不管authenticate是否仍引用它。

所以會發生的是,承諾會解決(或拒絕是否有錯誤),就像人們希望的那樣。

你的代碼已經放棄它的事實不會改變這一點。

如果拒絕,那麼大多數瀏覽器將在Web控制檯上顯示關於此未處理的拒絕承諾的錯誤,因爲這被認爲是編程錯誤。

+0

感謝您的回覆。 *第一:*'service.authenticate'只是一個代表在第三方圖書館打電話的簡化方式。所以沒有決心或拒絕需要傳遞給它。 *第二:*「承諾不是垃圾收集」。 'foo = new Promise(function(resolve,reject){}','typeof foo ==='object'); // true'。正如你所看到的Promise是一個被變量foo引用的對象。 – rabbitco

+0

因此,如果刪除了引用,Promise對象將實現引用計數和標記和掃描算法以進行垃圾收集。我很難理解爲什麼這些算法不適用於Promise對象。你能詳細說明一下嗎? – rabbitco

+0

函數'resolve'和'reject'仍然引用promise。如果你可以在JavaScript中像這樣跳過它,它不會被垃圾回收。 – jib