0

角度コードでは、次のようなチェーンされた約束があります。

// a function in LoaderService module.
var ensureTypesLoaded= function(){
   return loadContainerTypes($scope).then(loadSampleTypes($scope)).then(loadProjectList($scope)).then(loadSubjectTypes($scope));
 }

これらの関数はそれぞれ、リソースから物をロードし、さらにエラーと成功時に $scope を変更する promise を返します。

         var loadProjectList = function ($scope) {

            // getAll calls inside a resource method and returns promise.
            return   ProjectService.getAll().then(
                function (items) {
                   // succesfull load
                    console.log("Promise 1 resolved");
                    $scope.projectList = items; 
                }, function () {
                    // Error happened
                    CommonService.setStatus($scope, 'Error!');
                });
        };

コントローラーの初期化のコードで次のように使用するつもりです。

// Part of page's controller initialization code
LoaderService.ensureTypesLoaded($scope).then(function () {
            // do something to scope when successes
             console.log("I will do something here after all promises resolve");
            }, function () {
            // do something when error 
            });

しかし、これは私が望むようには機能しません。理想的には、「すべての約束が解決したら、ここで何かをします」というメッセージが表示される必要があります。代わりに、ensureTypesLoaded にリストされている関数内で解決された promise からのメッセージよりも前に表示されることがわかります。

次のような関数 ensureTypesLoaded を作成したいと思います。

  • チェーンされたすべてのロードが解決されたときに解決される promise を返します。
  • 「内部」プロミスのいずれかが失敗した場合、関数は次の呼び出しに進むべきではありませんが、拒否されたプロミスを返します。
  • 明らかに、ensureTypesLoaded().then(...) を呼び出す場合、ensureTypesLoaded 内のすべてが解決された後に then() 内のものを呼び出す必要があります。

チェーンされた約束を正しく構築するのを手伝ってください。

4

1 に答える 1