【问题标题】:Trying to understand how promises work in Ember试图了解承诺在 Ember 中是如何工作的
【发布时间】:2015-09-13 18:17:18
【问题描述】:

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

用户模型具有以下关联:

profile: DS.belongsTo('polymorphable', { polymorphic: true, async: true })

路线有:

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(在组件中)返回一个承诺?

【问题讨论】:

    标签: ember.js ember-cli


    【解决方案1】:

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

    代理 Promise 允许您在代理 Promise 上使用 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);
        });
      }
    }
    

    【讨论】:

    • 如果我在不同的路由中使用相同的组件,但是这一次,我直接传递了profile 对象(不是用户)。 saveProfile 应该是什么样子?在您的示例中,saveProfile 期望传入的参数是一个承诺对象
    • 我个人认为解决承诺不应该是组件的工作,尽管使用 rsvp cast 非常容易实现。只需将其转换为 Promise,如果它是 Promise,则不会发生任何变化,如果不是,则将其包装在 Promise 中。 (上面扔了一个例子)
    • 如果你想事先解决它并将它附加到控制器并正确传递它,我会看看我对这个问题的回答,它应该能够引导你正确路径:stackoverflow.com/questions/20521967/…
    • 我也同意让组件解决承诺感觉很脏。我正在考虑使用afterModel 钩子来设置profile,然后在模板中我可以通过{{foo-bar saveProfile=(action "save") profile=profile}} 渲染组件。您对此有何看法?还是有更好的方法?
    • 这就是我会使用的方法,感觉就像正确的代码在做正确的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多