3

「解決」オブジェクトを使用して引数を渡し、コントローラーをインスタンス化しようとしています。構文は次のとおりです。

{
  controller: 'HtmlModalController',
  resolve: {
    myarg: function() {
      return "FOO";
    }
  }
}

これにより、コントローラーに "myarg" 変数が値 "FOO" の引数として挿入されます。

現在、この構文はプロミスもサポートしており、コントローラーのインスタンス化時に自動的に解決されます。

  resolve: {
    myarg: function() {
      // Does the same as above (auto-resolved promise)
      return $q.when("FOO");
    }
  }

さて、問題は次のとおりです。コントローラーに promise を挿入するにはどうすればよいですか? コントローラーがロードされたら解決するので、約束を解決したくありません。複数の promise をネストしようとしましたが、それらはすべてコントローラーで一度 "FOO" 値に解決されます。

  resolve: {
    myarg: function() {
      // All promises are resolved for me :'(
      return $q.when($q.when("FOO"));
    }
  }

今のところ私の唯一の解決策は、プロミスを関数/オブジェクトにラップすることです:

  resolve: {
    myarg: function() {
      // So in my controller I can do "myarg.promise.then(...)"
      return {promise: $q.when("FOO")};
    }
  }

これが非ブロッキングの詳細であることは知っていますが、約束を「約束として」適切に解決する方法があるかどうか疑問に思います。

ありがとう =)

4

2 に答える 2

2

最終的な値に暗黙的に再帰的にアンラップされない限り、promise で解決する方法はありません。promise で解決すると、常に promise 自体ではなく、promise の結果で解決されます。

唯一のオプションは、メソッド{p: promise }なしで行ったようにラッパーを渡すことです。then

于 2015-08-11T21:01:19.450 に答える
0

使用できるパターンの 1 つは、Promise を提供して内部的にキャッシュするサービスです。

function MyService() {
    var promise;
    this.getSomePromise = function() {
        if(!promise) {
            promise = $q.when(...); // whatever produces your promise
        }
        return promise;
    }
}

myModule.service('myService', MyService);

その後、コントローラーでこのサービスに依存できます。

myModule.controller('MyController', function(myService) {
    myService.getSomePromise().then(result => ...);
});

それを使用して解決をブロックするだけでなく、

resolve: {
    /** 
      * Note: we are not actually injecting this. 
      * Only using it to block the route. The name blocker is arbitrary and could be anything.
      */
    blocker: function(myService) {
        return myService.getSomePromise();
    }
}

これにより、基になる非同期操作と 1 つの promise インスタンスへの呼び出しを 1 つだけ確保しながら、必要な数の then ハンドラーをサービス メソッドに接続できます。

于 2016-11-22T16:49:45.317 に答える