factory.dataPromise = null;
factory.getData = function() {
if (this.dataPromise !== null) {
return this.dataPromise;
}
else {
const req = {...};
return this.dataPromise = $http(req).then((res) => {
this.data1 = res.data.response[0];
this.data2 = res.data.response[1];
return res;
})
}
}
這有點粗糙,但應該能夠在這裏找到工作,雖然老實說我會建議重構一些代碼。但我想盡可能少地重構這個答案。
關鍵是要始終回報承諾。只要你這樣做,你就沒事。如果我們檢查this.data1
和this.data2
是否已經可用,我們可以返回一個立即解決的承諾,而不需要進行另一個HTTP調用。
哦,如果不清楚,你需要包含$q
(或者將其替換爲你想要的任何其他Promise庫),以便能夠清楚地創建承諾。
思考:不是一個真正的嚴重問題,但是當你調用factory.getData()
你不實際使用由承諾解決的價值。這就是爲什麼在我的回答中,我只是有一個變量whateverdata
,因爲它根據您的代碼返回的內容並不重要,因爲它沒有被使用。
也許那麼,最好讓承諾做的工作。我會建議在這種情況下,這個重構:
factory.dataPromise = null;
factory.getData = function() {
if (this.dataPromise !== null) {
return this.dataPromise;
}
else {
const req = {...};
return this.dataPromise = $http(req).then((res) => {
this.data1 = res.data.response[0];
this.data2 = res.data.response[1];
return { data1: this.data1, data2: this.data2 };
})
}
}
this.factory.getData().then((data) => {
this.controllerData1 = data.data1;
this.controllerData2 = data.data2;
})
它更直觀一點,它實際上利用承諾的好處。但是,最終取決於你。
感謝您的迴應!我會考慮重構。我認爲還有一個時間問題。如果兩個控制器幾乎同時需要這些數據,則可能已經創建了HTTP請求,但data1和data2尚未定義,並且執行將進入_else _塊。我仍然看到我的代碼發出2個HTTP請求。 – lemontree
對,你應該和我原來的想法一致。這實際上更好,因爲它沒有'$ q'。概念是,我們只運行一次HTTP方法,並且將承諾存儲在一個變量中,然後所有將來的調用都會使用它。運行'this.dataPromise = null'的''clearData'函數可能會很好,因爲您希望再次從HTTP調用中獲取新數據。 – aaronofleonard
謝謝 - 這個伎倆。我只需要在ui-router的狀態改變時重置dataPromise爲null,以便data1和data2中的數據不會過時。 – lemontree