簡體   English   中英

等待嵌套的承諾完成

[英]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')
})

因此,為了進行所有設置,我基本上是在嘗試

  1. 創建容器,
  2. 然后,創建細節,其中可能有很多
  3. 然后,創建項目,其中會有盡可能多的細節
  4. 等待所有諾言解決
  5. 一旦容器裝滿了所有東西,請執行自定義的休息操作以“激活”容器。

代碼看起來像這樣(咖啡),簡化了,但我認為要旨在那里

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM