0

我是一名經驗豐富的Ember.js開發人員。在指南中,我們可以找到具有全名的計算屬性的例子(同步,簡單,依靠名字和姓氏)。在野外,我們可以發現計算屬性以異步方式的大量用法(例如,在承諾解決後自行設置 - 第一次運行並得到返回undefined)。Ember Computed屬性意味着用於/包含異步代碼?

我越看到這個異步計算屬性我越想知道 - 計算屬性是否意味着與異步代碼一起使用?難道不是在惹麻煩嗎?

一個常見問題是其他計算屬性(CP2)依賴於異步CP1。 CP2獲得CP1,但獲得undefined(因爲CP1將在稍後時間設置其值,因爲它是異步的)。 CP2使用錯誤的CP2值完成計算(undefined)。 CP1自行設置,但是CP2不再重新計算(即使CP1已更改),因爲CP2未在模板中引用(這意味着它將被綁定並始終需要其值,並且始終會在CP1更改時重新計算) - 而是由一些JavaScript調用引用。

真實世界的例子可能是根據訂單中的物品計算總訂單(來自電子商務店)的價格。計算屬性依賴於項目的異步關係,這些項目可能包含其他異步關係,如稅類型。

回答

1

我假設你是指混合計算屬性和承諾。如果你這樣做,那麼不。我多次偶然發現這個問題。我發現這很有問題,特別是深嵌套關聯。

我當時也在研究電子商務網站。最初,我發現很多計算在網站呈現時沒有得到解決。原因是因爲我將承諾傳遞給計算屬性(用於計算)。之後,我意識到我應該在將結果傳遞到計算邏輯之前解決所有關係。我在服務中做了這一步。舉一個例子來說明我的意思:

比方說,訂單有很多項目,你想計算總價格,價格是項目中的字段。

相反的:

total: Ember.computed("[email protected]", function() { 
    return this.get("order.items").reduce((sum, obj) => { 
    return sum + obj.get("price"); 
    }); 
}); 

我這樣做:

total: Ember.computed("[email protected]", function() { 
    return this.get("items").reduce((sum, obj) => { 
    return sum + obj.get("price"); 
    }); 
}); 

其中items以上的地方傳過來的承諾的結果。

我發現這個post解釋why-you-should-not很好。

我很想回過來問同樣的問題。渴望聽到更多關於此的想法。

+0

我沒有使用'items。@。price'這種格式,這個有效嗎? 'items。@ each.price'這是否有區別? – kumkanillam

+0

哦,這是一個錯字,它應該是@each :),你是對的 – kasperite

+0

我不同意你的解決方案,而我發現其餘的答案很有價值。將等待更多的想法。 :) –

相關問題