web-dev-qa-db-ja.com

Kriskowalのqで複数回拒否/解決するとどうなりますか?

私はpromiseパターンを研究していて、node.jsにkriskowalのqを使用しています。

このスニペットを持っている:

var deferred = Q.defer();
try {
    messageData = JSON.parse(message);
} catch (e) {
    global.logger.warn('Error parsing JSON message.');
    deferred.reject(e);
}
...
if (some_reason)
    deferred.resolve(something);
...
return deferred.promise;

パーサーが両方とも失敗し、some_reasonがtrueの場合はどうなりますか?

実行は拒否から解決まで進み、両方のpromiseのメソッドが異なる時間に呼び出されて、バグが発生しますか?

拒否/解決を複数回呼び出すことは避けるべきですか?

29
Luca Vitucci

約束は1回しか解決できません (履行されたまたは拒否された)ので、最初の解決が勝ち、それ以降の呼び出しは無視されます。から ドキュメント

約束が解決された(つまり、履行または拒否された)すべての場合において、解決は永続的であり、リセットすることはできません。 promiseがすでに解決されている場合に、resolve、reject、またはnotifyを呼び出そうとしても、何も起こりません。

拒否/解決を複数回呼び出すことは避けるべきですか?

2つのメソッドを相互に「競合」させて遅延を解決するようにアプリケーションを設計することもできますが、一般に、読者の混乱を減らすために回避する必要があります。

45
Bergi