web-dev-qa-db-ja.com

ES6矢印関数からの約束の解決

ES6で理解しているドキュメントを読むと、次の意味がわかります。

foo => someFun(foo); 

と同等です:

foo => { return someFun(foo); }

新しいPromiseを返し、そのコード内で矢印関数を使用して解決メソッドと拒否メソッドを呼び出します。

return new Promise(function(resolve, reject)
{
    someFunThatReturnsAPromise()
    .then(data => resolve(data))
    .catch(err => reject(err));
});

そのため、実際には当時のコードです。

.then(data => return resolve(data))

もしそうなら、resolveの結果(値のタイプがわからない)は重要ですか?代わりに少し簡潔にして、暗黙の戻りを防ぐために{}を使用して記述します。

.then(data => { resolve(data); })
5
const

resolve関数はすでにundefinedを返します。したがって、1行の矢印関数を使用して暗黙的に返すか、関数本体からまったく返さない場合でも、まったく違いはありません(後者は、関数本体が暗黙的にundefined自体を返すことを意味します)。

さらに、someFunThatReturnsAPromise()によって返されたpromiseを新しいpromiseでラップしたので、とにかく戻りを処理するものはなく、何かを返しても違いはありません。

さらに重要なことに、プロミスを新しいプロミスでラップする方法はアンチパターンです。 new Promise()構造は、まだpromiseベースではない非同期プロセスを処理するためだけのものです。
someFunThatReturnsAPromise()はすでにpromiseを返しているので、新しいpromiseでラップする必要はなく、入手したものを使用するだけです。
あなたの例では、それは単にそれを返すことを意味します:

return someFunThatReturnsAPromise()

データの一部のみを返すなど、データの処理を実行する場合(以下の例ではstatusプロパティ)、thenコールバックで実行します。

return someFunThatReturnsAPromise().then(data => data.status)

thenコールバックで戻ると、返されたデータで解決される新しいPromiseが返されます(別のPromiseを返さない限り、そのPromiseが解決されると解決されます)。
これは、非同期プロセスとその結果を連鎖させることにより、promiseが機能するように設計されている方法です。

4
Lennholm

データを返したいだけで、エラーが発生した場合に拒否したい場合は、then()は必要ありません。

return new Promise(function(resolve, reject)
{
    someFunThatReturnsAPromise()
    .then(data => resolve(data))
    .catch(err => reject(err));
});

と同等になります

return someFunThatReturnsAPromise()

データに対して何らかの処理を行いたい場合を除きます

0
marvel308