我想實例化一個服務層類「foo」,它將負責調度API調用到代表我的表示層的任何地方。但是,「foo」所需的必要資源只能通過對不同端點進行AJAX調用才能實現。創建一個具有它的字段的對象取決於AJAX調用
例如,考慮foo是否需要獲取當前登錄用戶的accountId才能完成請求。但是,只有通過網絡調用端點「bar」才能使用accountId。
因此,我需要鏈接foo的呼叫與酒吧。
bar.getAccountId().then((accountId) => { foo.getInformation(accountId) });
但這意味着每當foo需要提出請求時,它將首先被bar的網絡調用阻止。如果我們知道一個事實,即在用戶在網站上使用的時間內,accountId不會改變,那麼它將是我們將accountId存儲到foo字段的理想選擇。
即Foo的構造函數中,我希望能夠做這樣的事情:
construtor() { bar.getAccountId().then((accountId) => {this._accountId = accountId });
現在,每當FOO需要撥打電話,我可以簡單地使用,而不是把網絡電話吧_accountId,讓我的呼籲只是foo的:
foo.getInformation() //we no longer need to supply an accountId, since it's cached inside foo.
但是,由於我們的構造現正AJAX調用,有沒有辦法讓我們知道呼叫是否已完成與否。如果我們嘗試這樣做:
var foo = new Foo; foo.getInformation()
我們不能確定foo的構造函數是否已經收到來自bar的響應。我提出的一個解決方法是簡單地將該承諾緩存在構造函數中。例如: -
//CLASS FOO
constructor() {
this._promise = bar.getAccountId().then((accountId) => {
this._accountId = accountId;
})
}
getInformation() {
if (this._promise.hasResolved()) {
return makeNetworkCall(this._accountId)
} else {
this._promise.then(() => {
return makeNetworkCall(this._accountId);
})
}
}
我想知道是否有一個現有的設計模式來解決這個問題,因爲我敢肯定,這是不夠的情況普遍。
這符合我的需求非常好,謝謝 – user3605508