Promise の値を取得するにはどうすればよいですか?
P粉116631591
2023-08-21 13:47:33
<p>私は Angular ドキュメントで <code>$q</code> の例を調べていましたが、これは Promise 全般に使えるのではないかと思いました。以下の例は、コメントも含めてドキュメントから直接コピーしたものです。
<pre class="brush:php;toolbar:false;">promiseB = PromiseA.then(function(result) {
結果 1 を返します。
});
//promiseA が解決されると、promiseB はすぐに解決され、その値は、promiseA に 1</pre> を加えた結果になります。
<p>これがどのように機能するのかわかりません。最初の <code>.then()</code> の結果に対して <code>.then()</code> を呼び出して、それらを連鎖させることができれば、それができることはわかっています。 ;code>promiseB</code> は、タイプ <code>Object</code> の Promise オブジェクトです。これは <code>Number</code> ではありません。では、「その値は、promiseA に 1 を加えた結果になります」とは何を意味するのでしょうか? </p>
<p><code>promiseB.value</code> のようにアクセスする必要がありますか?成功コールバックが Promise を返し、「結果 1」を返すにはどうすればよいでしょうか?何かが足りない。 </p>
Promise が解決または拒否されると、成功/エラー ハンドラーが呼び出されます:
リーリー
promiseA の成功/エラー ハンドラーは、promiseB の結果に影響を与える 3 つの可能な値を返すことができます:then
メソッドは、promise:promiseB も返します。これは、promiseA の成功/エラー ハンドラーの戻り値に基づいて解決/拒否されます。値を返さない →promiseB はすぐに解決され、未定義がpromiseB の成功ハンドラーに渡されます-
値を返す →PromiseB はすぐに解決され、値は PromiseB の成功ハンドラーに渡されます。
- Promise を返す → Promise が解決されると、PromiseB も解決されます。
Promise が拒否された場合、PromiseB は拒否されます。 promiseB の then ハンドラーに渡される値は、promise
の結果になります。
-
これを理解すると、次のことが理解できます:
リーリーthen 呼び出しはすぐにpromiseBを返します。
promiseA が解決されると、結果が PromiseA の成功ハンドラーに渡されます。
戻り値はpromiseAの結果1であり、成功ハンドラーは値を返すため(上記のオプション2)、promiseBはすぐに解決され、promiseBの成功ハンドラーにはpromiseAの結果1が渡されます。
promiseA
のthen
関数は、promiseA
が解決された直後に解決される新しい Promise (promiseB
) を返します。値は次のとおりです。promiseA
の成功関数で返される値。この場合、
promiseA
は値result
に解決され、その後すぐにpromiseB
が値result 1
で解決されます。 。
リーリーpromiseB
の値へのアクセスは、promiseA
の結果へのアクセスと同じです。ECMAScript 2016 (ES7、2016) 以降、
リーリーasync
/await
が JavaScript の標準となり、上記のアプローチの代替構文が可能になります。これで、次のように書くことができます:promiseB はありません。これは、
await
を使用して PromiseA の結果をアンラップしたためであり、それを直接使用できます。ただし、
リーリーawait
はasync
関数内でのみ使用できます。少し拡大してみると、上記のコードは関数内に含める必要があります:async 関数は Promise を返すため、この例の
doSomething
関数の戻り値は依然として Promise であることは明らかです。したがって、戻り値にアクセスしたい場合は、result = await doSomething()
を使用する必要があります。これは、別の非同期関数内でのみ使用できます。基本的に、親の非同期コンテキストでは、子の非同期コンテキストによって生成された値に直接アクセスできます。