這可能看起來像是對承諾的濫用,或者「你做的都是錯的」問題,如果有的話請糾正我。 我碰到幾個點,我想要在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方法裏面等待,直到答案解決爲止,然後返回?
夠公平的,這是真的。但是,您會希望某些方法在完成之前會被阻止。我通常在這裏看到的問題是,如果你有4或5個需要等待前一個完成的調用,則需要分別「級聯」3或4次,這似乎不切實際。 我想知道是否有像在jquery ajax中的「async:false」標誌。有時你只想阻止,直到完成某件事。 – Tom
@Tom你是什麼意思的級聯?使用承諾,你將保持完全平坦,特別是使用咖啡腳本,你將有很少的代碼冗長,這將是同步的 – Esailija
你是對的,我做了一些更多的研究,並實施了一些測試用例,..我認爲這是更重要的問題的個人偏好來自非事件背景。當我想到這個案子時,我忽略了那個「當時」沒有嵌套。我們現在的解決方案是後綴返回promise的方法,所以使用api的任何人都知道這個方法返回一個承諾而不是一個值。感謝您的啓示! 另一方面,所有實現同步承諾或事件的實現都覺得像黑客或非常醜陋。 JS處理線程的方式似乎不適用於阻塞。 – Tom