【问题标题】:JQuery blocking for an asynch initialization用于异步初始化的 JQuery 阻塞
【发布时间】:2013-02-10 07:27:13
【问题描述】:

我正在为 SignalR 集线器编写 AngularJS 服务。这是我的服务工厂:

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

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

【问题讨论】:

    标签: javascript jquery angularjs signalr


    【解决方案1】:

    类似下面的东西应该可以解决问题。

    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,它可以通过函数过滤deferred 的状态和值......这些过滤器函数可以返回一个新值传递给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..
    
    });
    

    【讨论】:

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

    你不会找到你要找的东西,你将不得不接受 Lee 的回答。 Javascript 大多是单线程的,不允许阻塞(有特定的例外,例如警报窗口或同步 ajax 调用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      相关资源
      最近更新 更多