明示的なプロミス構築のアンチパターンとは何ですか? また、それを回避するにはどうすればよいですか? 質問する

明示的なプロミス構築のアンチパターンとは何ですか? また、それを回避するにはどうすればよいですか? 質問する

次のようなことを実行するコードを書いていました:

function getStuffDone(param) {
    return new Promise(function(resolve, reject) {
        myPromiseFn(param+1)  
        .then(function(val) { 
            resolve(val);     
        }).catch(function(err) {
            reject(err);
        });
    });
}

または:

function getStuffDone(param) {
    var d = Q.defer(); /* or $q.defer */
    // or = new $.Deferred() etc.
    myPromiseFn(param+1)
    .then(function(val) { /* or .done */
        d.resolve(val);
    }).catch(function(err) { /* .fail */
        d.reject(err);
    });
    return d.promise; /* or promise() */
}

誰かがこれをそれぞれ「遅延アンチパターン」または「Promiseコンストラクタアンチパターン」と呼ぶと教えてくれましたが、このコードのどこが悪いのか、なぜこれが「遅延アンチパターン」と呼ばれるのか教えてください。アンチパターン?

ベストアンサー1

遅延アンチパターン(現在は明示的構築アンチパターン)造語エサイリヤこれは、Promise を初めて使用する人がよくやるアンチパターンです。私も、初めて Promise を使用したときにこれをやりました。上記のコードの問題は、Promise が連鎖するという事実を活用していないことです。

Promise は と連鎖することができ.then、直接 Promise を返すことができます。 のコードはgetStuffDone次のように書き直すことができます。

function getStuffDone(param){
    return myPromiseFn(param+1); // much nicer, right?
}

Promise は、非同期コードをより読みやすくし、その事実を隠すことなく同期コードのように動作させることが目的です。Promise は、1 回限りの操作の値の抽象化を表し、プログラミング言語のステートメントまたは式の概念を抽象化します。

遅延オブジェクトは、APIをPromiseに変換する自動的に実行できない場合や、この方法で簡単に表現できる集計関数を記述する場合に便利です。

Esailija 氏の言葉を引用します:

これは最も一般的なアンチパターンです。Promise をあまり理解しておらず、Promise を誇張されたイベント エミッターやコールバック ユーティリティと考えると、これに陥りやすくなります。まとめると、Promise は、フラットなインデントや 1 つの例外チャネルなど、同期コードで失われた特性のほとんどを非同期コードで保持できるようにすることです。

おすすめ記事