Ember:解决复杂的异步承诺

时间:2014-12-09 11:08:56

标签: javascript asynchronous ember.js ember-data

我有一个用例,其中Ember Data中的所有模型关系都是异步加载的。我有一个路由,根据parent.child是否匹配特定模型,在下面的示例中呈现祖父母。

到目前为止,我已经能够设法解决祖父母和父模型的异步加载,但后来我的代码变得非常混乱。

是否有任何有用的策略可以过滤掉祖父母而无需在每个级别处理承诺?

示例模型定义

App.Grandparent = DS.Model.extend({
    ...
    parents: DS.hasMany('Parent', { async: true })
});

App.Parent = DS.Model.extend({
    ...
    grandParent: DS.belongsTo('Grandparent', { async: true }),

    child: DS.belongsTo('Child', { async: true })
});

App.Child = DS.Model.extend({
    ...
});

代码示例

    var client = this.modelFor('workspace.client');


    var promise = new Ember.RSVP.Promise(function(resolve)
    {

        client.get('sessions').then(function(sessions)
        {

            Ember.RSVP.all(sessions.getEach('exercises')).then(function(exercises)
            {

                Ember.RSVP.all(exercises.getEach('exercise')).then(function()
                {

                    console.log("RESOLVED");

                    resolve(sessions);

                });


            });


        });

    });

1 个答案:

答案 0 :(得分:1)

我认为通过链接承诺可以简单地逃脱。

var client = this.modelFor('workspace.client');

return client.get('sessions').then(function(sessions) {
  return Ember.RSVP.all(sessions.getEach('exercises'));
}).then(function(exercises) {
  return Ember.RSVP.all(exercises.getEach('exercise'));
}).then(function(allExercises) {
  console.log("RESOLVED");
  return allExercises;
});

注意:不确定在解决会话时你想做什么,而不是在练习中做任何事情