[英]Waiting for Nested Promises to complete
我有一個復雜的對象圖,我在灰燼控制器建立。
export default Container({
username: DS.attr('string'),
items: DS.hasMany('item')
})
export default SomeDetail({
foo: DS.attr('string')
})
export default Item({
detail_type: DS.attr('string'),
detail_id: DS.attr('number'),
container: DS.belongsTo('container')
})
因此,為了進行所有設置,我基本上是在嘗試
代碼看起來像這樣(咖啡),簡化了,但我認為要旨在那里
promises = []
store = @store
items = @get('itemsInMyController')
store.createRecord('container',
username: @get('username')
).save().then(container) ->
items.forEach (item) ->
store.createRecord('detail',
# Set Properties
).save().then (detail) ->
item = store.createRecord('item',
# Set Properties
)
promsies.push item
item.save()
Ember.RSVP.allSettled(promsies).then (responses) ->
# Perform Activate Action
當所有的諾言都解決了,一切都是我想要的,但是,allSettled開火太早了,因為在細節解決之前就已經達成了,所以還沒有創建項目,因此數組中什么也沒有。 如果我添加細節到數組,因為已經創建項目之前它仍然達到了很好也會發生這種情況。
我唯一能做的就是讓單獨的數組跟蹤不同的promise,並在每個解析時嵌套一個allSettled,但是這開始變得非常麻煩,我想知道是否有更好的方法。
謝謝!
您需要從then
回調中return
promise,以便可以正確地將它們嵌套 。 因此,首先從該回調return
項目Promise,並獲得一個Promise,您實際上可以立即在該循環中將其推送到promises
數組:
promises = []
@get('itemsInMyController').forEach (item) =>
promise = @get('store').createRecord('detail',
# Set Properties
).save().then (detail) =>
item = @get('store').createRecord('item',
# Set Properties
)
item.save() # this returns a promise
) # and `promise` resolves with that result eventually
promises.push promise
現在,您有了一個可以實際傳遞給allSettled
的諾言數組。 您也不能在容器的then
回調之外也調用它(因為promises
屆時仍然為空),而在回調內部,則可以再次為數組返回那個promise以便平整鏈。
而且我建議不要使用forEeach
並手動構建該數組,只需使用map
:
@store.createRecord('container',
username: @get('username')
).save().then (container) =>
promises = @get('itemsInMyController').map (item) =>
@get('store').createRecord('detail',
# Set Properties
).save().then (detail) =>
@get('store').createRecord('item',
# Set Properties
).save()
Ember.RSVP.allSettled promises
.then (responses) ->
# Perform Activate Action
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.