异步初始化的JQuery阻塞

JQuery blocking for an asynch initialization

本文关键字:阻塞 JQuery 初始化 异步      更新时间:2023-09-26

我正在为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,它可以通过函数过滤deferred的状态和值。。。这些过滤函数可以返回一个新值,将其传递给promise的.done()或.fail()回调,也可以返回另一个可观察对象(Deferred、promise等),该对象将其已解析/已拒绝状态和值传递给promet的回调。。。


更新

另一种方法(可能是更好的方法,因为它不需要你的消费者处理承诺)是在设置工厂和启动应用程序控制器之前,让集线器完全初始化。像这样的。。。

$.connection.hub.start().then(function() {
  app.factory('gameManager', function() {
    return $.connection.gameManager;
  });
  // ...
  // kick off the rest of the app..
});

你找不到你要找的东西,你必须按照李的答案去做。Javascript大多是单线程的,不允许阻塞(除了特定的例外,例如警报窗口或同步ajax调用)。