3 回答

TA貢獻1790條經驗 獲得超9個贊
這是正確的方法嗎?
是。對返回的函數使用memoisation提供了一種通用技術,可以避免重復執行異步(通常是昂貴的)任務。承諾使緩存變得容易,因為不需要區分正在進行的操作和已完成的操作,它們都表示為(相同的)結果值的承諾。
這是正確的解決方案嗎?
不是。全球data
變量和解決方案undefined
不是承諾的工作方式。相反,履行結果的承諾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
獲取參數(如url)時需要查找不同的promise 。

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

TA貢獻1829條經驗 獲得超4個贊
此設計設計模式將緩存第一次運行時返回的任何內容,并在每次再次調用時返回緩存的內容。
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);
簡單地用另一個自動調用函數包裝你的函數,該函數返回一個函數(你原來的異步函數),而包裝器函數的目的是為局部變量提供封裝范圍cache
,這樣局部變量只能在返回的函數中訪問。包裝函數,每次asyncTask
調用都具有完全相同的值(除了第一次)
添加回答
舉報