2016-08-04 32 views
-1

這裏曾經解決一諾千金:在賽車時

var getVersion = new Promise(function(resolve){ getVersionAsyn(resolve); }); 那麼很多HTTP請求取決於「版本」,並請求在同一時間發送。

當頁面初始化時,很多http請求將發送到服務器,並且請求取決於'版本'。

如何防止getVersion承諾多次運行?


好的。我投票自己。這樣的白癡問題。

+0

_「然後很多http請求依賴於'版本'並且請求在同一時間發送'_什麼是'getVersionAsyn'的文本?哪個函數會產生多個HTTP請求? – guest271314

+0

將'resolve'傳遞給'getVersionAsyn'函數的目的是什麼? – guest271314

+0

_「如何防止'getVersion'承諾多次運行?」_爲什麼'getVersion'被多次調用?不確定預期的結果是什麼?防止發生多個請求?或者防止函數被遞歸調用?儘管在問題中沒有出現遞歸? – guest271314

回答

2

如何防止getVersion答應多次運行?

您已經緩存了承諾,因此版本的解析值只能被調用一次。您可以根據承諾獲得儘可能多的處理程序,而後續的所有操作只需從promise數據結構中提取保存的已分解值。他們不會一遍又一遍地「執行」其他任何事情。

此代碼的工作方式:

var getVersion = new Promise(function(resolve){ 
    getVersionAsyn(resolve); 
}); 

getVersion是一個承諾,你已經將它存儲。當你這樣做,你可以有許多來電者:

getVersion.then(function(version) { 
    // access the version here 
}); 

而且,getVersionAsyn()將只被稱爲只有一次,第一次。從那時起,一旦承諾解決了,您將只需訪問保存的解析值(本質上是一個自動緩存)。它實際上是一個很好的設計模式,它使用promise來緩存和異步檢索值。

+0

'getVersion。然後(函數(版本){ //在這裏訪問版本 });''將'版本'可以在'.then()'''''''getVersion''返回''''''''另外,'resolve'似乎確實被調用? – guest271314

+0

@ guest271314 - 對不起,但我不明白那個評論。 'getVersion'是一個承諾。使用'.then()'將會返回無論您調用一次還是一次100次都能解決的承諾值。承諾永遠不會改變他們解決的價值。 – jfriend00

+0

在Answer處調用javascript的'resolve'嗎?或作爲參考傳遞給'getVersionAsyn'?請注意,問題中的要求不明確,在這裏。 – guest271314

1

保持在隨後的承諾的執行上下文的getVersion的結果...

getVersion.then(version => { 
    var reqA = doHttp(version, "request A"); 
    var reqB = doHttp(version, "request B"); 
    var reqC = doHttp(version, "request C"); 
    return Promise.all([reqA, reqB, reqC]); 
}); 
+0

但是頁面初始化後的http請求怎麼樣?我需要解決'''getVersion'''again嗎? – JamesYin

+0

按照我的建議,所有這些http請求都將訪問相同的'version'結果,只運行一次,但在依賴它的任何請求之前運行。 – danh