7

ブルーバード ライブラリでプロミスを正しく使用する方法を理解しようとしています。私は自分のコードでいくつかの入れ子になった約束に出くわしました.bluebirdのドキュメントで次のように書かれていることに気付きました:

完全な bluebird API オファリングを利用している場合、最初からネストされた promise に頼る必要はほとんどありません。

Promise の誤用については他にも多くのブログ記事があり、ネストは通常​​のアンチパターンです。

loadCar(someUri) // jqXHR
    .then(function (car) {
        if (carHasFourDoors(car)) {
            loadMake(car.make)
                .then(function (make) {
                    loadModel(make.model)
                        .then(function (model) {
                            loadCarDetails(model)
                        });
                });
        }
        else if (carHasTwoDoors(car)) {
            loadModel(make.model)
                .then(function (model) {
                    loadCarDetails(model)
                });
        }
    });

私の関数はすべてオブジェクトを返します。bluebird のドキュメントを見ると、複数のヘルパー メソッドがあるようです: all()、join()、props()。

だから、私の質問は次のとおりです。依存関係がある場合、ネストを回避するにはどうすればよいですか? おそらく、これはプロミスの非同期性に関する私の誤解です。このようなものは機能しますか?

Promise.all(loadCar(someUri), loadMake(car.make), loadModel(make.model))
    .then(function(car, make, model) {
        // do logic
    });
4

1 に答える 1

6

制御構造には常に入れ子が必要であり、通常は に渡される関数式に 1 レベルの入れ子が必要ですthen()。完全に回避できるわけではありませんが、大幅に減らすことができます。

あなたの場合、関数式の一部を省略して関数を直接渡すこともできます。

loadCar(someUri).then(function (car) {
    if (carHasFourDoors(car)) {
        return loadMake(car.make)
    else if (carHasTwoDoors(car))
        return make; // not sure actually where you get this from
}).then(function (make) {
    return loadModel(make.model)
}).then(loadCarDetails)
于 2014-06-25T15:32:39.693 に答える