Route
Ember 中物品的一个细节就是他们接受并处理承诺.但是,我想知道在路由model
钩子中返回promise的优点是什么,而不是在相应的API请求返回时填充的空记录或记录数组.似乎结果是相似的,但我认为我忽略了某些东西,即优势.
int*_*xel 12
因为我是DRY的忠实粉丝所以我不得不引用/提取完整文章的重要段落,不久前由Alex Matchneer完成的路由器整理到余烬,Router
然后用我自己的话解释它.
为什么?
- 应用程序启动的转换和URL启动的转换之间的语义差异使得在某些情况下处理错误或异步逻辑非常具有挑战性
- 基于身份验证的应用程序尤其难以实现
redirect
有时会在解析承诺模型时调用,有时不会,这取决于应用程序内/ URL过渡解
解决方案是采用异步并使路由器转换为一等公民.在新的API中,您将获得必要的挂钩,以通过
Transition
传递给各种挂钩的对象来防止/修饰转换尝试.这些钩子是:
willTransition
每当过渡即将发生时,在当前路线上发起的事件.beforeModel/model/afterModel
在异步验证阶段挂钩.
...
model
和朋友在此路由器迭代中,transitionTo和URL更改的行为方式相同,因为如果模型具有.then属性(表示它是一个承诺),则通过transitionTo提供的任何模型或从模型挂钩返回的任何模型都将暂停转换.
由于这个添加到余烬Router
(版本RC6),您将在源代码中找到类似下面的代码,其中IMHO看起来很漂亮并且很容易理解:
从来源:
return RSVP.resolve().then(handleAbort)
.then(beforeModel)
.then(handleAbort)
.then(model)
.then(handleAbort)
.then(afterModel)
.then(handleAbort)
.then(proceed)
.then(null, handleError);
Run Code Online (Sandbox Code Playgroud)
这是再次完整文章的链接.
希望这可以帮助.