次のようなものでうまくいくはずです。
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..
});