Ember.js 等待嵌套的承诺完成

Ember.js 等待嵌套的承诺完成,ember.js,coffeescript,promise,Ember.js,Coffeescript,Promise,我在一个余烬控制器中建立了一个复杂的对象图 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('num

我在一个余烬控制器中建立了一个复杂的对象图

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')
})
所以,为了建立这一切,我基本上是想

  • 创建conatainer
  • 然后,创建可能有很多细节的细节
  • 然后,创建项目,其中包含尽可能多的细节
  • 等待所有承诺得到解决
  • 一旦容器有了所有的东西,启动一个定制的rest操作来“激活”容器
  • 代码看起来像这样(咖啡),简化了,但我认为要点就在那里

    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启动得太早了,因为它是在细节解决之前到达的,所以项目还没有创建,所以数组中没有任何内容。如果我将细节添加到数组中,也会发生这种情况,因为在创建项之前就已经到达了数组

    我唯一能做的就是使用单独的数组跟踪不同的承诺,并在每个承诺解决时使用嵌套的AllSetted,但这开始让人感到毛骨悚然,我想知道是否有更好的方法


    谢谢

    您需要
    中返回
    承诺,然后
    回调,以便正确地执行这些承诺。因此,首先
    返回该回调中的项目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
    
    现在,您得到了一系列承诺,您可以将这些承诺传递给
    allselled
    。您不能在容器的
    then
    回调之外调用它(因为
    promises
    到那时仍然是空的),而是在回调内部,您可以再次为数组返回该promise,以便展平链

    我建议不要为每个
    使用
    并手动构建该数组,只需使用
    映射

    @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
    

    您需要
    中返回
    承诺,然后
    回调,以便正确地执行这些承诺。因此,首先
    返回该回调中的项目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
    
    现在,您得到了一系列承诺,您可以将这些承诺传递给
    allselled
    。您不能在容器的
    then
    回调之外调用它(因为
    promises
    到那时仍然是空的),而是在回调内部,您可以再次为数组返回该promise,以便展平链

    我建议不要为每个
    使用
    并手动构建该数组,只需使用
    映射

    @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
    

    您需要
    中返回
    承诺,然后
    回调,以便正确地执行这些承诺。因此,首先
    返回该回调中的项目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
    
    现在,您得到了一系列承诺,您可以将这些承诺传递给
    allselled
    。您不能在容器的
    then
    回调之外调用它(因为
    promises
    到那时仍然是空的),而是在回调内部,您可以再次为数组返回该promise,以便展平链

    我建议不要为每个
    使用
    并手动构建该数组,只需使用
    映射

    @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
    

    您需要
    中返回
    承诺,然后
    回调,以便正确地执行这些承诺。因此,首先
    返回该回调中的项目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
    
    现在,您得到了一系列承诺,您可以将这些承诺传递给
    allselled
    。您不能在容器的
    then
    回调之外调用它(因为
    promises
    到那时仍然是空的),而是在回调内部,您可以再次为数组返回该promise,以便展平链

    我建议不要为每个
    使用
    并手动构建该数组,只需使用
    映射

    @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
    

    不太熟悉coffee脚本,但是AllSetted语句是在容器创建的承诺之内还是之外?Nvm从@BergiNot那里看到的答案真的很熟悉咖啡脚本,但AllSetted语句是在容器创建的承诺之内还是之外?Nvm从@BergiNot那里看到的答案真的很熟悉咖啡脚本,但AllSetted语句是在容器创建的承诺之内还是之外?Nvm从@BergiNot那里看到的答案真的很熟悉咖啡脚本,但AllSetted语句是在容器创建的承诺之内还是之外?Nvm请参阅来自的答案@Bergi@Kingpin2k:谢谢您通过编辑提供的提示!不过,我想只使用胖箭头更符合CS的习惯。我正在尽量减少原始代码中的内容:-)是的,我认为这是一个胖箭头的东西,但由于不熟悉CS(除了CSJS网站),我想我应该避免表现得好像我知道我在用他们做什么,以免把事情搞砸;)我今天花了几个小时想弄明白这一点。直到呈现模板之后,才解析嵌套的承诺。使用RSVP.all()返回数组是关键。@Kingpin2k:谢谢您在编辑过程中给出的提示!不过,我想只使用胖箭头更符合CS的习惯。我正在尽量减少原始代码中的内容:-)是的,我认为这是一个胖箭头的东西,但由于不熟悉CS(除了CSJS网站),我想我应该避免表现得好像我知道我在用他们做什么,以免把事情搞砸;)我今天花了几个小时想弄明白这一点。直到呈现模板之后,才解析嵌套的承诺。使用RSVP.all()返回数组是关键。@Kingpin2k:谢谢你的提示