2014-09-24 98 views
3

我正在使用Request-Promise請參閱下面的代碼)。請求 - 承諾:確保緩存結果

問題:如果我緩存一個承諾,是否緩存結果或每次要求一個新的?

例子:

var cachedPromise = getTokenPromise(); 
cachedPromise.then(function(authorizationToken1) { 
    //... 
}); 
cachedPromise.then(function(authorizationToken2) { 
    //... 
}); 
//QUESTION: Is right that authorizationToken1 equals authorizationToken2 

getTokenPromise()函數:

var querystring = require('querystring'); 
var rp = require('request-promise'); 

/** 
* Returns an authorization token promise 
*/ 
function getTokenPromise() { 
    var requestOpts = { 
     encoding: 'utf8', 
     uri: 'https://datamarket.accesscontrol.windows.net/v2/OAuth2-13', 
     method: 'POST', 
     body: querystring.stringify({ 
      'client_id': 'Subtitles', 
      'client_secret': 'Xv.............................s=', 
      'scope': 'http://api.microsofttranslator.com', 
      'grant_type': 'client_credentials' 
     }) 
    }; 
    return rp(requestOpts); 
} 

回答

4

如果我緩存承諾,做到這一點緩存結果

一個承諾只能有一個結果(如果它沒有被拒絕)。因此它也只能解決一次 - 而且不能在此後改變它的狀態。

事實上,promise spec狀態

    1. 當滿足,一個承諾:
      • 不得過渡到任何其他國家。
      • 必須有,其中一定不能更改
  • 或每次問一個新的?

    getTokenPromise()是要求令牌的調用,它只執行一次。 cachedPromise只有代表結果,而不是一個動作。即使您未通過.then()添加回調,該操作本身也會執行。