1. ホーム
  2. angularjs

[解決済み] すべての約束が解決するのを待つ

2022-10-19 08:36:23

質問

未知の長さの複数のプロミスチェーンを持っている状況があります。私はすべてのチェーンが処理されたときに実行されるアクションが欲しいです。それは可能ですか?以下はその例です。

app.controller('MainCtrl', function($scope, $q, $timeout) {
    var one = $q.defer();
    var two = $q.defer();
    var three = $q.defer();

    var all = $q.all([one.promise, two.promise, three.promise]);
    all.then(allSuccess);

    function success(data) {
        console.log(data);
        return data + "Chained";
    }

    function allSuccess(){
        console.log("ALL PROMISES RESOLVED")
    }

    one.promise.then(success).then(success);
    two.promise.then(success);
    three.promise.then(success).then(success).then(success);

    $timeout(function () {
        one.resolve("one done");
    }, Math.random() * 1000);

    $timeout(function () {
        two.resolve("two done");
    }, Math.random() * 1000);

    $timeout(function () {
        three.resolve("three done");
    }, Math.random() * 1000);
});

この例では $q.all() を設定します。これは、あるランダムな時間に解決される約束1、2、3に対してです。そして、1 と 3 の端に約束事を追加します。私は all が解決されるようにしたいのです。このコードを実行したときの出力は以下のとおりです。

one done 
one doneChained
two done
three done
ALL PROMISES RESOLVED
three doneChained
three doneChainedChained 

チェーンが解消されるのを待つ方法はありますか?

解決方法は?

すべての連鎖が解消されたときに、オールも解消してほしい。

もちろん、それなら各チェーンのプロミスを all() は、最初の約束の代わりに

$q.all([one.promise, two.promise, three.promise]).then(function() {
    console.log("ALL INITIAL PROMISES RESOLVED");
});

var onechain   = one.promise.then(success).then(success),
    twochain   = two.promise.then(success),
    threechain = three.promise.then(success).then(success).then(success);

$q.all([onechain, twochain, threechain]).then(function() {
    console.log("ALL PROMISES RESOLVED");
});