1. ホーム
  2. javascript

[解決済み] 明示的なプロミス構築のアンチパターンとそれを回避する方法とは?

2022-03-17 10:36:20

質問

というようなことをするコードを書いていました。

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

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

解決方法は?

その 遅延のアンチパターン (現在は明示的な構築のアンチパターン) による造語です。 エスセーリア は、プロミスを使い始めたばかりの人がよくやるアンチパターンです。上記のコードの問題点は、プロミスが連鎖するという事実を利用できていないことです。

プロミスは以下のように連鎖することができます。 .then で、プロミスを直接返すことができます。の中のあなたのコードは getStuffDone は次のように書き換えることができる。

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

プロミスは、非同期コードをより読みやすくし、その事実を隠すことなく同期コードのように振る舞うことができるようにするためのものです。プロミスは1回の操作の値を抽象化したもので、プログラミング言語における文や式の概念を抽象化したものです。

ディファードオブジェクトを使用するのは、次のような場合だけにしてください。 APIをプロミスに変換する 自動でできない場合や、この方法で表現した方が簡単な集約関数を書いている場合などです。

引用元: Esailijaさん

<ブロッククオート

これは最も一般的なアンチパターンです。プロミスをよく理解せず、イベントエミッターやコールバックユーティリティのように考えていると陥りがちです。プロミスは非同期コードにフラットインデントや1つの例外チャネルといった同期コードで失われた特性のほとんどを保持させるものです.