在第一个示例代码中,所有功能均应正常工作-在每次页面路由更改时,我们都会检查某些条件($timeout)并解决承诺:

JSFiddle Var sample code

在第二个示例中,我们将var rulesFactory移至app.factory('rulesFactory'),现在它可以工作一次:

JSFiddle App Factory sample code

是缓存吗?如何解决此问题以提高代码的可重用性?

最佳答案

rulesFactory中的代码仅运行过一次-首次实例化服务本身。

它是在第一次解析时执行的:


Angular看到它正在寻找一种名为“ rulesFactory”的东西
Angular找到一个名为rulesFactory的服务。它看到没有人使用过rulesFactory,并实例化了该服务。
服务rulesFactory被实例化,并且$ timeout运行并返回了一个promise


它在第二次解析时执行此操作:


Angular看到它正在寻找“ rulesFactory”。 rulesFactory已经存在!
Angular只是获取rulesFactory的现有对象。
超时已从较早的时间用完,并且将使用相同的已解决承诺。


解决此问题的方法是让rulesFactory返回一个函数,该函数将在每次需要时再次运行超时。

另外,$ timeout本身会返回一个承诺,因此您只需返回$ timeout :-)

http://jsfiddle.net/JbTkp/4/

07-28 10:12