はい、これは状態とアクションを連鎖させる正しい方法です。
ステートメントのチェーン.then
は非常に一般的であり、通常、パイプを使用する際のビルディング ブロックです。それは約束のまさに核心にあります。
あなたがしていることは、正しくて慣用的です。
好奇心旺盛な方のために、これをお見せしましょう。
これを確認するために、promise の仕様を確認できます。
次のことを確認します。
- 連鎖する
- 拒否の場合、チェーン内のハンドラーを呼び出さず、
then
同じ理由で返された次のプロミスを拒否します
- 戻り値を渡して順次実行します。
仕様を使用して、これらを順番に確認しましょう-特に.then
:
1.連鎖する
7.1 は promise [3.3] を返さなければなりません。
すばらしい、フルフィルメントにも連鎖することを確認しましょう
onFulfilled または onRejected のいずれかが値 x を返す場合、Promise Resolution Procedure >[[Resolve]](promise2, x) を実行します。
then
これで、promise が解決または拒否されたときに、適切なパラメーターを使用してハンドラーが呼び出されることがわかりました。したがって、解決.then(do_A).then(do_B)
を前提として常に機能します。do_A
2. 拒否の場合、チェーン内のハンドラを呼び出さない
7.iv. onRejected が関数ではなく、promise1 が拒否された場合、promise2 も同じ理由で拒否する必要があります。
素晴らしいので、存在するonRejected
場合は拒否して呼び出し、存在しない場合はチェーンします。
then
3. から返された次の promiseを同じ理由で拒否する
これについては 2 で説明しました。
4. 戻り値を渡して順次実行します。
それがまた
onFulfilled または onRejected のいずれかが値 x を返す場合、Promise Resolution Procedure [[Resolve]](promise2, x) を実行します。
したがって、onFulfilled を設定すると、解決プロセスが実行されます。解決プロセス自体は次のように指示します。
promise 解決手順は、promise と値を入力として受け取る抽象的な操作であり、[[Resolve]](promise, x) と表します。x が thenable の場合、x が少なくともある程度 promise のように動作するという仮定の下で、promise に x の状態を採用させようとします。それ以外の場合、値 x で約束を果たします。
resolvePromise が値 y で呼び出された場合、[[Resolve]](promise, y) を実行します。
ここで、y は x の戻り値です。
すごい!だからそれは動作します。