7

Ember中对象的优点之一Route是它们接受和处理承诺。但是,我想知道在路由的model钩子中返回承诺与在相应的 API 请求返回时填充的空记录或记录数组相比有什么优势。结果似乎相似,但我假设我忽略了一些东西,即优势。

4

1 回答 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 回答