我正在为SignalR中心编写AngularJS服务。这是我的服务工厂:
.factory('gameManager', [function () {
$.connection.hub.start();
var manager = $.connection.gameManager;
return manager;
}])
该代码将是完美的,除了.start()
调用是异步的,并且hub在返回管理器时尚未完成。基本上,我想阻止直到开始完成才返回经理。 .start()
方法返回一个Jquery deferred对象,我猜这是对象的一部分,但我不知道如何在没有回调函数的情况下使用它?
答案 0 :(得分:3)
以下内容应该可以解决问题。
app.factory('gameManager', [function () {
return $.connection.hub.start().then(function() {
return $.connection.gameManager;
});
}])
现在您的回调函数也将返回延迟/承诺,因此服务使用者需要预期。您的消费代码可能如下所示:
gameManager.then(function(gameManager) {
// do whatever with game manager
gameManager.doSomething();
});
jquery Deferred are here的文档。特别是,请查看Deferred.then()
。
请注意:
deferred.then()方法返回一个新的promise,它可以通过函数过滤延迟的状态和值......这些过滤函数可以返回一个新值,传递给promise的.done()或者.fail()回调,或者它们可以返回另一个可观察对象(Deferred,Promise等),它会将其已解析/拒绝的状态和值传递给promise的回调...
更新:
另一种方法(可能是更好的方法 - 因为它不需要您的消费者处理承诺)是让集线器在设置工厂之前完全初始化,然后启动应用控制器。像这样......
$.connection.hub.start().then(function() {
app.factory('gameManager', function() {
return $.connection.gameManager;
});
// ...
// kick off the rest of the app..
});
答案 1 :(得分:0)
你找不到你要找的东西,你必须得到李的回答。 Javascript主要是单线程的,不允许阻塞(具有特定的例外情况,例如警报窗口或同步ajax调用)。