0

SignalRハブ用のAngularJSサービスを作成しています。これが私のサービスの工場です:

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

その.start()呼び出しが非同期であり、マネージャーが返されるまでにハブが開始していないことを除いて、そのコードは完璧です。基本的には、マネージャーを返す前に、開始が完了するまでブロックしたいと思います。この.start()メソッドはJqueryの遅延オブジェクトを返します。これは答えの一部だと思いますが、コールバック関数なしで使用する方法がわかりません。

4

2 に答える 2

3

次のようなものでうまくいくはずです。

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

これで、コールバック関数も遅延/約束を返すので、サービスコンシューマーはそれを期待する必要があります。消費するコードは次のようになります。

gameManager.then(function(gameManager) {

  // do whatever with game manager
  gameManager.doSomething();
});

jqueryDeferredのドキュメントはこちらです。特に、をチェックしてくださいDeferred.then()

ご了承ください:

deferred.then()メソッドは、関数を介して遅延のステータスと値をフィルタリングできる新しいPromiseを返します...これらのフィルター関数は、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..

});
于 2013-02-09T22:42:32.853 に答える
0

あなたはあなたが探しているものを見つけることができません、あなたはリーの答えに従わなければなりません。Javascriptはほとんどシングルスレッドであり、ブロッキングを許可しません(アラートウィンドウや同期ajax呼び出しなどの特定の例外を除く)。

于 2013-02-09T23:27:13.500 に答える