3 回答

TA貢獻1790條經(jīng)驗 獲得超9個贊
這是正確的方法嗎?
是。對返回的函數(shù)使用memoisation提供了一種通用技術(shù),可以避免重復(fù)執(zhí)行異步(通常是昂貴的)任務(wù)。承諾使緩存變得容易,因為不需要區(qū)分正在進行的操作和已完成的操作,它們都表示為(相同的)結(jié)果值的承諾。
這是正確的解決方案嗎?
不是。全球data
變量和解決方案undefined
不是承諾的工作方式。相反,履行結(jié)果的承諾data
!它還使編碼更容易:
var dataPromise = null;function getData() { if (dataPromise == null) dataPromise = $http.get("data.json").then(function (res) { return res.data; }); return dataPromise;}
然后,而不是loadDataPromise().then(function() { /* use global */ data })
簡單getData().then(function(data) { … })
。
為了進一步改進模式,您可能希望隱藏dataPromise
在閉包范圍中,并注意在getData
獲取參數(shù)(如url)時需要查找不同的promise 。

TA貢獻1946條經(jīng)驗 獲得超4個贊
為此,我創(chuàng)建了名為defer-cache-service的服務(wù),該服務(wù)刪除了所有這些樣板代碼。它在Typescript中寫入,但您可以獲取已編譯的js文件。Github 源代碼。
例:
function loadCached() { return deferCacheService.getDeferred('cacke.key1', function () { return $http.get("data.json"); }); }
和消費
loadCached().then(function(data) {//...});
需要注意的是,如果讓兩個或更多部件調(diào)用同一個loadDataPromise并同時進行,則必須添加此檢查
if (defer && defer.promise.$$state.status === 0) { return defer.promise;}
否則你將對后端進行重復(fù)調(diào)用。

TA貢獻1829條經(jīng)驗 獲得超4個贊
此設(shè)計設(shè)計模式將緩存第一次運行時返回的任何內(nèi)容,并在每次再次調(diào)用時返回緩存的內(nèi)容。
const asyncTask = (cache => {
return function(){
// when called first time, put the promise in the "cache" variable
if( !cache ){
cache = new Promise(function(resolve, reject){
setTimeout(() => {
resolve('foo');
}, 2000);
});
}
return cache;
}
})();
asyncTask().then(console.log);
asyncTask().then(console.log);
簡單地用另一個自動調(diào)用函數(shù)包裝你的函數(shù),該函數(shù)返回一個函數(shù)(你原來的異步函數(shù)),而包裝器函數(shù)的目的是為局部變量提供封裝范圍cache
,這樣局部變量只能在返回的函數(shù)中訪問。包裝函數(shù),每次asyncTask
調(diào)用都具有完全相同的值(除了第一次)
添加回答
舉報