Javascript 异步初始化的JQuery阻塞

Javascript 异步初始化的JQuery阻塞,javascript,jquery,angularjs,signalr,Javascript,Jquery,Angularjs,Signalr,我正在为信号中心编写AngularJS服务。这是我的服务工厂: .factory('gameManager', [function () { $.connection.hub.start(); var manager = $.connection.gameManager; return manager; }]) 该代码将是完美的,除了.start()调用是异步的,并且在返回管理器时尚未完成启动。基本上,在返回管理器之前,我希望阻塞直到启

我正在为信号中心编写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();
});
这些文件是为你准备的。特别是,请查看

请注意:

deferred.then()方法返回一个新的承诺,该承诺可以通过函数过滤deferred的状态和值。。。这些筛选函数可以返回一个新值,并将其传递给承诺的.done()或.fail()回调,也可以返回另一个可观察对象(延迟、承诺等),该对象将其已解析/拒绝的状态和值传递给承诺的回调


更新

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

$.connection.hub.start().then(function() {
  app.factory('gameManager', function() {
    return $.connection.gameManager;
  });

  // ...
  // kick off the rest of the app..

});

类似于下面的内容应该可以做到这一点

app.factory('gameManager', [function () { 
    return $.connection.hub.start().then(function() {
      return $.connection.gameManager;
    });
}])
现在您的回调函数也将返回一个延迟/承诺,因此服务消费者需要期待它。您的消费代码可能如下所示:

gameManager.then(function(gameManager) {

  // do whatever with game manager
  gameManager.doSomething();
});
这些文件是为你准备的。特别是,请查看

请注意:

deferred.then()方法返回一个新的承诺,该承诺可以通过函数过滤deferred的状态和值。。。这些筛选函数可以返回一个新值,并将其传递给承诺的.done()或.fail()回调,也可以返回另一个可观察对象(延迟、承诺等),该对象将其已解析/拒绝的状态和值传递给承诺的回调


更新

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

$.connection.hub.start().then(function() {
  app.factory('gameManager', function() {
    return $.connection.gameManager;
  });

  // ...
  // kick off the rest of the app..

});

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

您将找不到您要查找的内容,您必须使用Lee的答案。Javascript主要是单线程的,不允许阻塞(除了特定的异常,如警报窗口或同步ajax调用)。

所以它会立即返回承诺吗?如果服务使用者试图在承诺解析之前调用该承诺的方法,它会一直等到该承诺解析,还是失败?服务使用者需要使用承诺方法(例如
.then()
),以确保在使用管理器之前已解析该承诺。另一种选择是在hub启动之前不定义工厂,或启动应用程序控制器。我会用这个建议发布更新。这些都是很好的建议,谢谢!如果可能的话,我宁愿让我的消费者代码不知道承诺,如果我立即启动集线器,我就会失去从工厂获得的延迟加载。如果没有任何其他建议,我会将此标记为答案。如果您想要延迟加载,并且“加载”是一个异步过程,那么延迟访问器的接口(在本例中为服务/工厂)也必须是异步的。这很不方便,但没办法。这通常足以预加载异步资源。祝你好运。那么它会立即回报你的承诺吗?如果服务使用者试图在承诺解析之前调用该承诺的方法,它会一直等到该承诺解析,还是失败?服务使用者需要使用承诺方法(例如
.then()
),以确保在使用管理器之前已解析该承诺。另一种选择是在hub启动之前不定义工厂,或启动应用程序控制器。我会用这个建议发布更新。这些都是很好的建议,谢谢!如果可能的话,我宁愿让我的消费者代码不知道承诺,如果我立即启动集线器,我就会失去从工厂获得的延迟加载。如果没有任何其他建议,我会将此标记为答案。如果您想要延迟加载,并且“加载”是一个异步过程,那么延迟访问器的接口(在本例中为服务/工厂)也必须是异步的。这很不方便,但没办法。这通常足以预加载异步资源。祝你好运