角度コードでは、次のようなチェーンされた約束があります。
// 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() 内のものを呼び出す必要があります。
チェーンされた約束を正しく構築するのを手伝ってください。