非同期完了#
Nodeライブラリは、さまざまな方法で非同期処理を扱います。最も一般的なパターンはエラーファーストコールバックですが、ストリーム、Promise、イベントエミッター、子プロセス、またはObservableに出会うかもしれません。Gulpタスクは、これらすべてのタイプの非同期処理を正規化します。
タスク完了の通知#
ストリーム、Promise、イベントエミッター、子プロセス、またはObservableがタスクから返されると、成功またはエラーは、続行するか終了するかをgulpに通知します。タスクがエラーになると、gulpはすぐに終了し、そのエラーを表示します。
series()でタスクを構成する場合、エラーが発生すると構成が終了し、それ以上のタスクは実行されません。parallel()でタスクを構成する場合、エラーが発生すると構成が終了しますが、他の並列タスクは完了する可能性があります。
ストリームを返す#
Promiseを返す#
イベントエミッターを返す#
子プロセスを返す#
Observableを返す#
エラーファーストコールバックの使用#
タスクから何も返されない場合、完了を知らせるためにエラーファーストコールバックを使用する必要があります。コールバックは、以下の例ではcb()という名前で、タスクへの唯一の引数として渡されます。
エラーファーストコールバックを使用してタスクでエラーが発生したことを gulp に示すには、唯一の引数として Error を指定して呼び出します。
ただし、多くの場合、このコールバックを自分で呼び出すのではなく、別の API に渡すことになります。
同期タスクは不可#
同期タスクはサポートされなくなりました。それらは、タスクからストリームを返すのを忘れるなど、デバッグが難しい微妙な間違いにつながることがよくありました。
「非同期完了のシグナルを忘れていませんか?」という警告が表示された場合、上記のいずれのテクニックも使用されていません。問題を解決するには、エラーファーストコールバックを使用するか、ストリーム、プロミス、イベントエミッター、子プロセス、またはオブザーバブルを返す必要があります。
async/await の使用#
上記のオプションのいずれも使用しない場合、タスクをasync関数として定義できます。これにより、タスクがプロミスでラップされます。これにより、awaitを使用してプロミスを同期的に操作し、他の同期コードを使用できます。