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);
);
))
这以前有效,但在更新后,child
在then
调用后未定义。我不得不把它改成
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 更新导致模板中的承诺不等待解决的主要内容,如果未能解决你的问题,请参考以下文章