JavaScriptのいたるところにあるコールバックは、プロセス制御の災害であり、その欠点は明らかです。
1.明示的なリターンがなければ、それらによって引き起こされる不必要なプロセスとバグを簡単に生成することができます。
2。コードは無限にネストされており、読み取りが困難です。
上記の問題を解決し、回避する方法について話しましょう。
最初の問題は習慣の問題です。コールバックを使用する場合、人々はしばしばリターンの使用を忘れます。この状況は、コーヒースクリプトを使用する場合に特に当てはまります(JavaScriptにコンパイルされたときに戻り値として最後のデータを収集しますが、この返品値は必ずしも元の意図を表しているわけではありません)。以下の例をご覧ください。
コードコピーは次のとおりです。
a =(err、callback) - >
callback()err?
console.log 'あなたは私を見るでしょう'
b = - >
console.log '私はコールバックです」
a(「エラー」、b)
このいわゆる「エラーファースト」コードスタイルでは、明らかにエラーが発生したときにメソッドAの後続のコードが実行されることは望ましくありませんが、プロセス全体をハングアップさせるためにスローを使用したくありません(優雅に死ぬ必要があります〜)。
1つの解決策は、もし...他の...を正直に書くことです...しかし、私は次のことを好みます:
コードコピーは次のとおりです。
a =(err、callback) - >
callback()を返しますか?
console.log 'あなたは私を見ないだろう」
b = - >
console.log '私はコールバックです」
a(「エラー」、b)
JavaScriptの非同期メソッドの返品値のほとんどは役に立たないため、ここでは、returnをプロセス制御ロールとして使用します。
2番目の問題は、根絶することが難しいことです。
良い方法は、一部のプロセス制御モジュールを使用して、コードをより整理しているように見えることです。たとえば、ASYNCは、反復、ループ、いくつかの条件付きステートメント、さらにはキューシステムなど、一連のインターフェイスを提供する優れたモジュールです。次の例を使用して、名前を書く2つの方法の利点と欠点を説明することができます。
コードコピーは次のとおりです。
#普通
first =(callback) - >
console.log '私は最初の機能です」
折り返し電話()
second =(callback) - >
console.log '私は2番目の関数です」
折り返し電話()
3番目=() - >
console.log '私は3番目の関数です」
最初 - >
2番目 - >
三番目()
#asyncを使用します
async = require( 'async')
async.waterfall [
初め、
2番、
三番目
]、(err) - >
賢い人として、あなたはどちらを選びますか?