在第一个示例代码中,所有功能均应正常工作-在每次页面路由更改时,我们都会检查某些条件($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/