32

私は約束のパターンを研究しており、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 のメソッドが異なるタイミングで呼び出され、バグが発生しますか?

reject/resolve を複数回呼び出すのは避けるべきですか?

4

2 に答える 2

51

promise は 1 回しか解決できないため(履行または拒否)、最初の解決が優先され、それ以降の呼び出しは無視されます。ドキュメントから:

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

reject/resolve を複数回呼び出すのは避けるべきですか?

遅延を解決するために 2 つのメソッドが互いに「競合」するようにアプリケーションを設計することもできますが、一般的には、読者の混乱を減らすために避けるべきです。

于 2013-08-13T20:24:01.777 に答える