次のようなことを実行するコードを書いていました:
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 つの例外チャネルなど、同期コードで失われた特性のほとんどを非同期コードで保持できるようにすることです。