JQuery阻止异步初始化

时间:2013-02-09 22:29:02

标签: javascript jquery angularjs signalr

我正在为SignalR中心编写AngularJS服务。这是我的服务工厂:

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

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

2 个答案:

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