试图了解承诺如何在Ember中发挥作用

时间:2015-09-13 18:17:18

标签: ember.js ember-cli

当我以为我终于掌握了承诺如何在Ember工作的概念。这种情况让我重新陷入混乱之中。

用户模型具有以下关联:

model: function(params) {
  return this.store.findRecord('user', 1);
}

该路线有:

{{model.profile.firstName}}
{{foo-bar saveProfile=(action "save") profile=model.profile}}

在模板中,我正在渲染一个组件:

{{model.profile.firstName}}

<button {{action "saveProfile" profile}}>Save</button> 渲染得很好。

组件模板具有:

actions: {
  saveProfile(profile) {
    console.log(profile);
  }
}

组件对象具有:

console.log

单击组件模板中的按钮时。 Class {isFulfilled: true, __nextSuper: undefined, __ember_meta__: Object, __ember1442167214792: "ember688"} 呈现:

model.profile

模板已解析profile,并且已将已解析的值传递给模板。为什么{{1}}(在组件中)返回一个promise?

1 个答案:

答案 0 :(得分:1)

由于您没有包含user类定义,我会稍微猜一下。您的配置文件属性是异步关系,异步关系使用代理承诺。

代理承诺允许您在代理承诺上使用getter,它会解析该属性,就像它在代理本身上存在一样。这意味着您的模板没有已解决的profile,但正在调用model.get('profile.firstName')并获取已解析的值(即使稍后履行了个人资料)。

model.profile是代理承诺,当承诺已经履行时,您可以在其上使用getter并期望显示基础记录的值。

由于这种关系是异步的,你应该始终认为它还没有完成,等待在尝试使用记录之前履行承诺。

actions: {
  saveProfile(profilePromise) {
    profilePromise.then(function(profileRecord){
      console.log(profileRecord);
    });
  }
}

使用演员

actions: {
  saveProfile(profileMaybePromise) {
    Ember.RSVP.Promise.cast(profileMaybePromise).then(function(profileRecord){
      console.log(profileRecord);
    });
  }
}