异步初始化的JQuery阻塞
JQuery blocking for an asynch initialization
我正在为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调用)。
相关文章:
- 无法从 jQuery RSS Feed 中的 localStorage 动态替换类
- 如何使用jQuery自动打开页面上的所有链接
- 如何使用jquery在填充自动完成的值后使文本框只读
- jQuery:循环一个具有不同超时值的循环
- 用程序搜索JQuery数据表中的文本
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- jQuery匹配JSON对象的部分文本
- Jquery POST未填充数组
- jQuery$(document).ready阻塞页脚脚本时出错
- 使用 JavaScript 或 jQuery 检测 Firefox 混合内容阻塞
- 为什么当jquery加载大量数据时浏览器会被阻塞
- 加载阻塞jQuery动画
- 使用jquery修剪输入而不阻塞空格输入
- 如何使一个非阻塞睡眠在javascript/jquery
- JQuery中的阻塞
- jQuery的fadeIn()、animation()函数是非阻塞的吗?
- 使jQuery模态不阻塞其他UI元素
- Jquery美元.when阻塞代码执行和UI更新
- 异步初始化的JQuery阻塞
- JQuery.Load()是否将标记呈现和Java脚本作为单个阻塞调用执行