Ember中对象的优点之一Route
是它们接受和处理承诺。但是,我想知道在路由的model
钩子中返回承诺与在相应的 API 请求返回时填充的空记录或记录数组相比有什么优势。结果似乎相似,但我假设我忽略了一些东西,即优势。
问问题
1612 次
1 回答
12
因为我是DRY的忠实粉丝,所以我宁愿引用/摘录完整文章的重要段落,从Alex Matchneer 不久前完成的路由器改版到余烬,然后用我自己的话来解释它。Router
拥抱异步...
为什么?
- 应用程序启动的转换和 URL 启动的转换之间的语义差异使得在某些情况下处理错误或异步逻辑非常具有挑战性
- 基于身份验证的应用程序特别难以实现
redirect
有时会在解决承诺模型时调用,有时不会调用,具体取决于应用内/URL 转换解决方案
解决方案是采用异步并使路由器转换成为一等公民。在新的 API 中,您将获得必要的钩子,以通过
Transition
传递给各种钩子的对象来防止/装饰转换尝试。这些钩子是:
willTransition
每当转换即将发生时,在当前路由上触发的事件。beforeModel/model/afterModel
在异步验证阶段挂钩。
...
model
和朋友在此路由器迭代中,transitionTo 和 URL 更改的行为方式相同,因为通过 transitionTo 提供的任何模型或从模型钩子返回的任何模型如果模型具有 .then 属性(这表明它是一个承诺)将暂停转换。
由于这个添加到 ember Router
(RC6 版)中,您会在源代码中找到如下代码,恕我直言,它看起来很漂亮并且很容易理解:
从来源:
return RSVP.resolve().then(handleAbort)
.then(beforeModel)
.then(handleAbort)
.then(model)
.then(handleAbort)
.then(afterModel)
.then(handleAbort)
.then(proceed)
.then(null, handleError);
这是完整文章的链接。
希望这可以帮助。
于 2013-08-12T14:57:49.600 回答