2017-09-27 67 views
0

我有一個if/else塊,看起來像這樣/ else塊:如果有回報,ajax的承諾

if (this.getSessionStorageData()) { 
    this.initialData(this.getSessionStorageData()); 
} else if (this.shouldPerformXHR) { 
    this.loadXHRData(); 
} 

Prefably我想擴大這個塊,選擇創建成一個switch語句也許有點是這樣的:

let data = []; 

if (this.getSessionStorageData()) { 
    data = this.getSessionStorageData(); 
} else if (this.shouldPerformXHR) { 
    data = this.loadXHRData(); 
} 

return data; 

loadXHRData是一個AJAX請求。我在這個例子中猜測,如果shouldPerformXHR是真的,那麼在AJAX請求完成之前將會返回數據。

現在,XHR請求實際上是一個承諾,所以我可以接電話並使用then,但我的sessionStorage數據未使用承諾。

有什麼辦法可以像我的第二個例子那樣擁有相同的數據結構,但是有了我的承諾或者這是不可能的?

我想要一個方法來簡單地返回數據與任何必要的策略(ajax,會話等)。但目前看來,我被迫從ajax請求的.then子句中設置我的數據,這導致我在所有地方都有邏輯。

希望這是有道理的,如果不是,請去問問。

+0

但是你不能從調用返回,所以你得d帶有承諾的eal,所以getSessionStorageData返回一個承諾並將其設置爲立即解決。 – epascarello

+0

您正在尋找'Promise.resolve'。是的,您必須始終將該功能視爲異步。 – Bergi

回答

1

同步解析異步調用不起作用。所以your data = this.loadXHRData();將無法​​以這種方式運作。

這將意味着你的函數應該返回的東西通過你的被叫方來解決,因爲你的AJAX調用不能在此行來解決

因此,我們可以返回一個承諾,而不是它解決了價值this.getSessionStorageData();回報:

if (this.getSessionStorageData()) { 
    return Promise.resolve(this.initialData(this.getSessionStorageData())); // Will return a new Promise which is then-able. 
} else if (this.shouldPerformXHR) { 
    return this.loadXHRData(); 
} 

而且你的話者理應這樣做解決此承諾:

myFunction().then(function(data) { 
// do stuff with the data 
}); 
+0

確定調用'.resolve'會立即解決它?這可能是相當整潔,雖然它感覺weid包裝承諾的一切,但我想它是有道理的。 –

+0

嗯,這是你唯一的選擇。 AJAX無法同步解析,因此您的代碼必須適應其異步特性 –