web-dev-qa-db-ja.com

別のpromiseをpromiseハンドラーに渡す

_p1_は_console.log_で直接呼び出されるため、promiseハンドラーがpromise _p1_(値 "A"ではない)をログに記録することを期待していました。しかし、どういうわけか「A」を記録します。約束_p1_は、呼び出されることなく自動的に「A」に解決されますか?たとえば、console.log(p1)は、期待どおりに「A」を直接出力しません。舞台裏で何かが起こっていますか?

_var p1 = new Promise(function(resolve, reject) {
  resolve("A");
});

var p2 = new Promise(function(resolve, reject) {
  resolve(p1);
});

p2.then(function(v) {
  console.log(v)
});_

編集:私はその呼び出しを理解しています

_p1.then((v) => return v))
_

値vで満たされる新しいpromiseを返します。Imがここで何かを深刻に見逃していない限り、2番目のpromiseコンストラクターの「p1」参照はconsole.logに直接渡され、ブロックになります。

_var p2 = new Promise(function(resolve, reject) {
  resolve(p1);
});

p2.then(function(v) {
 console.log(v)
});
_

になる

_console.log(p1).
_

Console.logはp1.then(...)の結果ではなく、p1で直接呼び出されるため、別のプログラムを出力するのと同じ方法で、p1を値「A」に解決しないでください。

_var promise = new Promise(function(resolve, reject) {
  resolve("B")
})

console.log(promise)
_

文字列「B」にはなりません。

EDIT2:エグゼキュータに渡されたresolveパラメータが満たされていない関数のラッパーであると誤解していたため、多くの混乱が生じました。詳細については、 Promiseコンストラクターが完了時に 'resolve'を呼び出す関数を必要とするのに、 'then'は必要としないのはなぜですか?代わりに値を返しますか? .

15
kuan

約束を別の約束に解決すると、自動的に他の約束の結果を待機します。

これがpromiseを連鎖可能にするものです(then()コールバックでさらにpromiseを返します)。

7
SLaks

MDNドキュメント から:

Promise.resolve(value)

指定された値で解決されるPromiseオブジェクトを返します。値がthenableである場合(つまり、thenメソッドがある場合)、返されるpromiseはそのthenableを「フォロー」し、最終的な状態を採用します。それ以外の場合、返された約束は値で満たされます。一般に、値がpromiseであるかどうかわからない場合は、代わりにPromise.resolve(value)を使用して、戻り値をpromiseとして処理します。

p1はその後可能であるため、リターンプロミスはそれに続きます。

13
Quentin