Javascript 如何确定angularjs$服务何时完成其工作?

Javascript 如何确定angularjs$服务何时完成其工作?,javascript,angularjs,Javascript,Angularjs,我正在控制器内使用$location服务来启用深度链接。我的控制器执行以下操作: $location.path("/"+param); $("title").text(param); 第二行在第一行之后完成执行是至关重要的。否则,浏览器中的历史记录项将显示旧url的新标题,而不是旧url。Google.com目前存在此错误,请尝试从主页进行搜索,然后再进行另一次搜索,然后按住浏览器中的“后退”按钮并按最新的历史记录项,您将了解我的意思 解决此问题的一种方法是: $location.path("

我正在控制器内使用
$location
服务来启用深度链接。我的控制器执行以下操作:

$location.path("/"+param);
$("title").text(param);
第二行在第一行之后完成执行是至关重要的。否则,浏览器中的历史记录项将显示旧url的新标题,而不是旧url。Google.com目前存在此错误,请尝试从主页进行搜索,然后再进行另一次搜索,然后按住浏览器中的“后退”按钮并按最新的历史记录项,您将了解我的意思

解决此问题的一种方法是:

$location.path("/"+param);
setTimeout(function() {
    $("title").text(param);
}, 1);
…但这对我来说不太合适。因此,我的问题是,一旦
$location
singleton完成了自己的业务,我如何有力地推迟第二行的执行?

请注意,setter不会立即更新window.location。相反,$location服务知道作用域生命周期,并在作用域$digest阶段将多个$location突变合并为一个对window.location对象的“提交”


我认为您正在寻找一种适合一般异步服务的方法(??)。在我看来,您可能希望查看承诺/延迟实施,请参见。$q

“一开始,可能不太清楚为什么这种额外的复杂性值得这么麻烦。回报来自于承诺和延迟API所做的保证。”

希望这有帮助


--dan

如果
$location.path
的功能是这样的,则应该使用回调函数。我无法重现此问题,您使用的是哪个浏览器?虽然我同意这一点,但这种异步行为很奇怪。我想我们可能会改变这一点,需要多考虑一下…@Vojta我在Safari和Chrome上测试过。我通过创建一个状态管理器服务稍微重新构建了我的应用程序,该服务在用户导航我的应用程序时处理url路由和控制器生命周期。因此,我可以编写哑控制器,当它们即将导致状态更改时(例如,当它们在使用ng include中加载新的视图+控制器时),只通知状态管理器,然后,它会对任意深度的控制器堆栈进行排序,并将状态更改通知相关控制器,以便它们可以初始化自己并设置标题等等…@Vojta。。。通过这种方法,我可以创建一个复杂的嵌套视图+控制器层次结构,该层次结构使用简单、遵守德米特定律的控制器实现,这些控制器只负责管理自己的小子视图,并且完全不知道整个视图层次结构或应用程序的整体状态。控制器不需要担心深度链接,它只是工作。这个应用程序是幂等的,所以我完全避免了原始问题中的问题。太棒了,听起来好多了。顺便说一句,您可以使用绑定来设置标题:
设置前的默认标题
,并且特定的控制器仅设置标题。请务必查看$route+ng视图,听起来您可能会使用它。