2016-10-21 71 views
0

因此,我有2個控制器,它們依賴於工廠內某個功能獲取的數據。工廠看起來是這樣的:2個控制器依賴於工廠內的HTTP請求

factory.getData = function() { 
    const req = {...}; 
    return $http(req).then((res) => { 
     this.data1 = res.data.response[0]; 
     this.data2 = res.data.response[1]; 
     return res; 
}) 

然後在我的控制器:

this.factory.getData().then((data) => { 
    this.controllerData1 = this.factory.data1; 
    this.controllerData2 = this.factory.data2; 
}) 

注:我省略了實際的工廠名稱。 這讓我得到我需要的數據,但是兩個控制器都會觸發顯然不理想的http請求。所以我需要第二個控制器等待data1和data2被定義。我怎樣才能做到這一點?

回答

0
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.data1this.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; 
}) 

它更直觀一點,它實際上利用承諾的好處。但是,最終取決於你。

+0

感謝您的迴應!我會考慮重構。我認爲還有一個時間問題。如果兩個控制器幾乎同時需要這些數據,則可能已經創建了HTTP請求,但data1和data2尚未定義,並且執行將進入_else _塊。我仍然看到我的代碼發出2個HTTP請求。 – lemontree

+0

對,你應該和我原來的想法一致。這實際上更好,因爲它沒有'$ q'。概念是,我們只運行一次HTTP方法,並且將承諾存儲在一個變量中,然後所有將來的調用都會使用它。運行'this.dataPromise = null'的''clearData'函數可能會很好,因爲您希望再次從HTTP調用中獲取新數據。 – aaronofleonard

+0

謝謝 - 這個伎倆。我只需要在ui-router的狀態改變時重置dataPromise爲null,以便data1和data2中的數據不會過時。 – lemontree