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调用)。