2014-01-14 126 views
0

這可能看起來像是對承諾的濫用,或者「你做的都是錯的」問題,如果有的話請糾正我。 我碰到幾個點,我想要在Ember.js中同步缺省情況下是異步的調用。這裏是一個小例子:在Ember.js中同步承諾

class service extends Ember.Object 
    someProperty: null 

    doSomething: -> 
    #this.store was injected during initialisation 
    this.store.find("someModel", someSelector).then((result) => 
     @someProperty = result.someField 
     console.log "promise fulfilled" 
) 

調用以下代碼:

service.doSomething() 
console.log "this should be second" 

將導致:

"this should be second" 
"promise fulfilled" 

這意味着,如果有人調用該方法,並希望物業someProperty到在通話結束後設置它不會是這種情況。同步的唯一方法就是將其稱爲「service.doSomething()。then( - > ....)」。這意味着來電者需要知道承諾已退回。

有沒有什麼辦法可以在doSomething方法裏面等待,直到答案解決爲止,然後返回?

回答

1

這將意味着調用者需要知道一個承諾返回

呼叫者顯然總是需要知道哪些功能,他們在呼喚回報,甚至什麼參數需要。所以你在這裏確實沒有問題。

+0

夠公平的,這是真的。但是,您會希望某些方法在完成之前會被阻止。我通常在這裏看到的問題是,如果你有4或5個需要等待前一個完成的調用,則需要分別「級聯」3或4次,這似乎不切實際。 我想知道是否有像在jquery ajax中的「async:false」標誌。有時你只想阻止,直到完成某件事。 – Tom

+0

@Tom你是什麼意思的級聯?使用承諾,你將保持完全平坦,特別是使用咖啡腳本,你將有很少的代碼冗長,這將是同步的 – Esailija

+0

你是對的,我做了一些更多的研究,並實施了一些測試用例,..我認爲這是更重要的問題的個人偏好來自非事件背景。當我想到這個案子時,我忽略了那個「當時」沒有嵌套。我們現在的解決方案是後綴返回promise的方法,所以使用api的任何人都知道這個方法返回一個承諾而不是一個值。感謝您的啓示! 另一方面,所有實現同步承諾或事件的實現都覺得像黑客或非常醜陋。 JS處理線程的方式似乎不適用於阻塞。 – Tom

1

正如你已經猜到的,這不是一個好主意。 Javascript開發全部關於思考和異步工作,因此您的服務的客戶應暴露於承諾的API。我認爲這是一個公平的要求,因爲承諾是一個易於理解的概念,可以學習如何簡化異步編程。