Javascript 异步初始化的JQuery阻塞
我正在为信号中心编写AngularJS服务。这是我的服务工厂:Javascript 异步初始化的JQuery阻塞,javascript,jquery,angularjs,signalr,Javascript,Jquery,Angularjs,Signalr,我正在为信号中心编写AngularJS服务。这是我的服务工厂: .factory('gameManager', [function () { $.connection.hub.start(); var manager = $.connection.gameManager; return manager; }]) 该代码将是完美的,除了.start()调用是异步的,并且在返回管理器时尚未完成启动。基本上,在返回管理器之前,我希望阻塞直到启
.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启动之前不定义工厂,或启动应用程序控制器。我会用这个建议发布更新。这些都是很好的建议,谢谢!如果可能的话,我宁愿让我的消费者代码不知道承诺,如果我立即启动集线器,我就会失去从工厂获得的延迟加载。如果没有任何其他建议,我会将此标记为答案。如果您想要延迟加载,并且“加载”是一个异步过程,那么延迟访问器的接口(在本例中为服务/工厂)也必须是异步的。这很不方便,但没办法。这通常足以预加载异步资源。祝你好运