JQuery阻塞异步初始化

我正在为SignalR集线器编写AngularJS服务。 这是我的服务工厂:

.factory('gameManager', [function () { $.connection.hub.start(); var manager = $.connection.gameManager; return manager; }]) 

该代码将是完美的,除了.start()调用是异步的,并且在返回管理器之前集线器尚未完成。 基本上,我想阻止,直到开始完成,然后返回经理。 .start()方法返回一个Jquery 延迟对象,我猜这是答案的一部分,但我不知道如何在没有回调函数的情况下使用它?

像下面这样的东西应该做的伎俩。

 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的文档在这里 。 特别是,请查看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.. }); 

你不会找到你想要的东西,你必须得到李的回答。 Javascript主要是单线程的,不允许阻塞(具有特定的例外,例如警报窗口或同步ajax调用)。