Ember 更新导致模板中的承诺不等待解决

Posted

技术标签:

【中文标题】Ember 更新导致模板中的承诺不等待解决【英文标题】:Ember update causes promises in templates to not wait to resolve 【发布时间】:2016-03-24 03:11:00 【问题描述】:

我正在进行 ember 1.12.1 -> 1.13.11 和 ember data 1.0.0-beta.19.1 -> 1.13.15 更新。我之前有一个模板:

a-component parent=model.parent

和一个组件

parentChanged: on('init', observer('parent', function() 
  var parent = this.get('parent');
  if (parent) 
    parent.get('child').then(child => 
      this.set('child', child);
    );
  
))

这以前有效,但在更新后,childthen 调用后未定义。我不得不把它改成

parentChanged: on('init', observer('parent', function() 
  var parent = this.get('parent');
  if (parent) 
    parent.then(parent => 
      parent.get('child').then(child => 
        this.set('child', child);
      );
    );
  
))

让它恢复到更新前的工作状态。

有人知道这是为什么吗?似乎模板在更新后停止解析承诺。

【问题讨论】:

我赌的是无证行为不要等待它解决,以便它可以呈现承诺。也可能不相关,但我的建议是在a-component 所在的控制器/路由(或组件)中处理所有承诺。这样a-component 已经得到了一个已解决的值,而不是一个承诺。可能会让您的生活更轻松。 我非常同意这段代码需要重构。因此,如果我在模板中有其他内容,例如 b-component child=model.parent.child,它可能是其他组件的副作用? 它可能会起作用,不知道 :) 我根本没有真正依赖这种行为,而是 optet 来处理路由器或父组件中的承诺,但你可能会尝试它会感兴趣结果,如果你可以回帖。 我一直认为,如果你在提供给组件时以一个 promise 结尾,它会在它到达组件代码时解决,但它可能是无意中这样做的,并拖累了我这一切时间! 如果你将一个承诺传递给一个组件,它会收到一个承诺(就像其他所有值一样,如果你不使用帮助器,因为它们可以改变值),值不会在两者之间改变。 Afaik 仅当您在模板中使用它时(所以 promise.name)ember 隐式等待承诺解决并尝试使用它。 【参考方案1】:

交联https://github.com/emberjs/ember.js/issues/12732

因此,经过一些挖掘和复制http://emberjs.jsbin.com/ququdenari/edit?html,js,output,我无法仅使用 Promise 获得 1.12.1 中的初始工作案例。这让我相信这可能是 ember-data 建立关系承诺的方式,并且由于我从 1.0.0-beta.19.1 更新到 1.13.15,因此任何重大更改都是公平的游戏。

总之,我更好地理解了我的目标问题。

编辑:

我制作了一个插件 ember-resolve-promise-helper 来帮助从您的代码中抽象出这个问题。

【讨论】:

以上是关于Ember 更新导致模板中的承诺不等待解决的主要内容,如果未能解决你的问题,请参考以下文章

在 Ember 车把模板中呈现已解决的承诺值

在更新状态和重定向之前等待所有承诺解决

等待但从未解决/拒绝承诺内存使用[重复]

Ember Docs - Readonly嵌套数据

Axios 承诺解决/待处理承诺

解决承诺后,视图中的数据未更新