Node.js は JavaScript エンジン v8 に基づいており、シングルスレッドです。 Node.js は、Web 上の JavaScript に似た非同期プログラミング メソッドを使用して、I/O 操作のブロックを処理します。 Node.js でのファイルの読み取り、データベースへのアクセス、ネットワーク リクエストなどはすべて非同期である可能性があります。 Node.js を初めて使用する人、または他の言語背景から Node.js に移行する開発者にとって、非同期プログラミングは苦痛な部分です。この章では、最も単純なものからより深いものまで、Node.js 非同期プログラミングのあらゆる側面を紹介します。サンク、プロミス、コへの最も基本的なコールバックから、ES7 で予定されている async/await まで。
まず、非同期プログラミングの具体的な例から始めましょう。
複数の IP ロケーションの気象情報を取得します
ファイル ip.json には、さまざまな場所からのさまざまな訪問者を表す複数の IP アドレスを保存する配列があります。
考えを整理するために、次のステップに分けます。
1. IP アドレスを読み取ります。
2. IP アドレスに基づいて IP の地理的位置を取得します。
3. 地理的な位置に基づいて地域の天気を確認します
4. 結果をweather.jsonファイルに書き込みます。
コールバック
まず、Node.js API が通常提供する方法で実装してみます。ライブラリを使用せずにコールバックを非同期コールバックとして渡します。 3 つの基本モジュールを使用します:1.fs: ファイル ip.json から IP リストを読み取り、結果をファイルに書き込みます。 2.リクエスト: HTTP リクエストを送信し、IP アドレスに基づいて地理データを取得し、地理データを通じて気象データを取得するために使用されます。 3.querystring: リクエストを送信するための URL パラメータを組み立てるために使用されます。
新しい callback.js ファイルを作成し、次のモジュールを導入します:
地理データを使用して天気を取得します:
関数 geos2weathers(geos, callback) {
var 天気 = []
var geo
var 残り = geos.length
for (var i = 0; i
(関数(地理) {
geo2weather(geo.latitude, geo.longitude, function(err, 天気) {
(エラー) {
の場合
コールバック(err)
} else {
天気.geo = 地理
天気.push(天気)
残り--
}
If (残り == 0) {
コールバック(null、天気)
}
})
})(地理)
}
}
...
ips2geos と geos2weathers はどちらも比較的原始的な方法を使用しており、remain が返されるのを待っているアイテムの数を計算します。remain が 0 の場合、並列リクエストが終了したことを意味し、処理結果は配列にロードされて返されます。 。
最後のステップは、結果をweather.jsonファイルに書き込むことです:
上記の関数を組み合わせることで、次の目標を達成できます:
readIP('./ip.json', function(err, ips) {
if (エラー) {
ハンドラーエラー(エラー)
} else {
ips2geos(ips, function(err, geos) {
if (エラー) {
ハンドラーエラー(エラー)
} else {
geos2weathers(geos, function(err, 天気) {
if (エラー) {
ハンドラーエラー(エラー)
} else {
writeWeather(天気, function(err) {
if (エラー) {
ハンドラーエラー(エラー)
} else {
console.log('成功!')
}
})
}
})
}
})
}
})
哈哈、この適合ファイルを無視してください、これは JavaScript のセキュリティの問題です、真実です、プラグインは JavaScript のセキュリティの問題ではありません。
if (エラー) {
ハンドラーエラー(エラー)
} else {
geos2weathers(geos, geos2weathersCallback)
}
}
if (エラー) {
ハンドラーエラー(エラー)
} else {
writeWeather(天気、writeWeatherCallback)
}
}
if (エラー) {
ハンドラーエラー(エラー)
} else {
console.log('成功!')
}
}
では、本当の問題は何でしょうか?
もちろん、これは非同期の問題であり、本質的には次の 3 つのことに対処する必要があります。
1. 非同期操作が終了したら、コールバックで通知する必要があります。
2. 非同期的に生成された結果は、データ パラメータを受け入れて返す必要があります。
3. 非同期エラーが発生した場合はどうすればよいですか?コールバックは err パラメータを受け入れ、エラーを返します。