Node.js 非同期プログラミング コールバック入門 (1)_node.js
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 アドレスを保存する配列があります。
// ip.json
["115.29.230.208"、"180.153.132.38"、"74.125.235.224"、"91.239.201.98"、"60.28.215.115"]
各 IP ロケーションの現在の天気を取得できれば幸いです。結果を次の形式で Weather.json ファイルに出力します:
// 天気.json
[
{ "ip": "115.29.230.208", "天気": "雲", "地域": "浙江省" },
{ "ip": "180.153.132.38", "天気": "快晴"、 "地域": "上海" },
{ "ip": "74.125.235.224", "天気": "雨"、 "地域": "カリフォルニア" },
{ "ip": "60.28.215.115"、"天気": "晴れ"、"地域": "天津" }
]
考えを整理するために、次のステップに分けます。
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 ファイルを作成し、次のモジュールを導入します:
var qs = require('クエリ文字列')
ファイル内の IP リストを読み取り、fs.readFile を呼び出してファイルの内容を読み取り、JSON.parse を使用して JSON データを解析します。
(エラー) {
の場合 コールバック(エラー)
} else {
{
を試してください データ = JSON.parse(data)
コールバック(null, データ)
} キャッチ (エラー) {
コールバック(エラー)
}
}
})
}
...
次のステップは、IP を使用して地理情報を取得することです。リクエストを使用して、オープンな地理サービスをリクエストします。
request({
URL: URL、
json: true
}, function(err, resp, body) {
コールバック(err, body)
})
}
...
地理データを使用して天気を取得します:
...
関数 geo2weather(lat, lon, callback) {
var params = {
緯度: 緯度、
ロン: ロン、
APPID: '9bf4d2b07c7ddeb780c5b32e636c679d'
}
var url = 'http://api.openweathermap.org/data/2.5/weather?' qs.stringify(params)
request({
URL: URL、
json: true、
}, function(err, resp, body) {
コールバック(err, body)
})
}
...
地理と天気のインターフェイスを取得しましたが、複数の IP があるため、処理する必要がある少し複雑な問題がまだ残っています。
は、地理と天気データを並行して読み取る必要があります。
...
function ips2geos(ips, callback) {
var geos = []
var ip
var 残り = ips.length
for (var i = 0; i ip = ips[i];
(関数(ip) {
ip2geo(ip, function(err, geo) {
(エラー) {
の場合 コールバック(err)
} else {
geo.ip = ip
geos.push(geo)
残り--
}
If (残り == 0) {
callback(null, geos)
}
})
})(ip)
}
}
関数 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ファイルに書き込むことです:
...
function writeWeather(weathers, callback) {
var 出力 = []
var天気
for (var i = 0; i
Output.push({
IP:weather.geo.ip、
天気:weather.weather[0].main,
地域: Weather.geo.region
})
}
fs.writeFile('./weather.json', JSON.stringify(output, null, ' '), callback)
}
...
上記の関数を組み合わせることで、次の目標を達成できます:
...
関数 handlerError(err) {
console.log('エラー: ' エラー)
}
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 のセキュリティの問題ではありません。
関数 ReadIPCallback(err, ips) {
if (エラー) {
ハンドラーエラー(エラー)
} else {
ips2geos(ips, ips2geosCallback)
}
}
関数 ips2geosCallback(err, geos) {
if (エラー) {
ハンドラーエラー(エラー)
} else {
geos2weathers(geos, geos2weathersCallback)
}
}
if (エラー) {
ハンドラーエラー(エラー)
} else {
writeWeather(天気、writeWeatherCallback)
}
}
if (エラー) {
ハンドラーエラー(エラー)
} else {
console.log('成功!')
}
}
{
"ip": "180.153.132.38",
"天気": "晴れ"、
"地域": "上海"
}、
{
"ip": "91.239.201.98",
"天気": "雲"
}、
{
"ip": "60.28.215.115",
"天気": "晴れ"、
"地域": "天津"
}、
{
"ip": "74.125.235.224",
"天気": "雲"、
"地域": "カリフォルニア"
}、
{
"ip": "115.29.230.208",
"天気": "晴れ"、
"地域": "浙江省"
}
]
では、本当の問題は何でしょうか?
もちろん、これは非同期の問題であり、本質的には次の 3 つのことに対処する必要があります。
1. 非同期操作が終了したら、コールバックで通知する必要があります。
2. 非同期的に生成された結果は、データ パラメータを受け入れて返す必要があります。
3. 非同期エラーが発生した場合はどうすればよいですか?コールバックは err パラメータを受け入れ、エラーを返します。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











概要: C++ の非同期プログラミングを使用すると、時間のかかる操作を待たずにマルチタスクを行うことができます。関数ポインターを使用して、関数へのポインターを作成します。コールバック関数は、非同期操作が完了すると呼び出されます。 boost::asio などのライブラリは、非同期プログラミングのサポートを提供します。実際のケースでは、関数ポインターと boost::asio を使用して非同期ネットワーク リクエストを実装する方法を示します。

JavaScript 関数の非同期プログラミング: 複雑なタスクを処理するための必須スキル はじめに: 最新のフロントエンド開発では、複雑なタスクを処理することが不可欠な部分になっています。 JavaScript 関数の非同期プログラミング スキルは、これらの複雑なタスクを解決する鍵となります。この記事では、JavaScript 関数の非同期プログラミングの基本概念と一般的な実践的な方法を紹介し、読者がこれらのテクニックをよりよく理解して使用できるように、具体的なコード例を示します。 1. 非同期プログラミングの基本概念 従来の同期プログラミングでは、コードは次のようになります。

Web アプリケーションがより複雑になるにつれて、プログラマは大量のリクエストや I/O 操作を処理するために非同期プログラミングを採用する必要があります。 PHP: HypertextPreprocessor も例外ではありません。このニーズを満たすために、ReactPHP は PHP の最も人気のある非同期プログラミング フレームワークの 1 つになりました。この記事では、ReactPHP を使用して PHP で非同期プログラミングを行う方法について説明します。 1. ReactPHP の概要 ReactPHP はイベント駆動型プログラミングです。

PHP で非同期メッセージ処理を実装する方法 はじめに: 最新の Web アプリケーションでは、非同期メッセージ処理がますます重要になってきています。非同期メッセージ処理により、システムのパフォーマンスとスケーラビリティが向上し、ユーザー エクスペリエンスが向上します。一般的に使用されるサーバー側プログラミング言語である PHP は、いくつかのテクノロジを通じて非同期メッセージ処理を実装することもできます。この記事では、PHP で非同期メッセージ処理を実装するいくつかの方法を紹介し、コード例を示します。メッセージ キューの使用 メッセージ キューは、システム コンポーネントを分離する方法であり、さまざまなコンポーネントが相互に接続できるようにします。

PHP8 の新機能を深く理解する: 非同期プログラミングとコードを効率的に使用するにはどうすればよいですか? PHP8 は PHP プログラミング言語の最新メジャー バージョンであり、多くのエキサイティングな新機能と改善をもたらします。最も顕著な機能の 1 つは、非同期プログラミングのサポートです。非同期プログラミングを使用すると、同時タスクを処理するときのパフォーマンスと応答性を向上させることができます。この記事では、PHP8 の非同期プログラミング機能を詳しく説明し、それらを効率的に使用する方法を紹介します。まず、非同期プログラミングとは何かを理解しましょう。従来の同期プログラミング モデルでは、コードは線形シーケンスに従います。

Java フレームワークでの非同期プログラミングにおける 3 つの一般的な問題と解決策: コールバック地獄: Promise または CompletableFuture を使用して、より直感的なスタイルでコールバックを管理します。リソースの競合: 同期プリミティブ (ロックなど) を使用して共有リソースを保護し、スレッドセーフなコレクション (ConcurrentHashMap など) の使用を検討します。未処理の例外: タスク内の例外を明示的に処理し、例外処理フレームワーク (CompletableFuture.Exceptionally() など) を使用して例外を処理します。

Go フレームワークは Go の同時実行性と非同期機能を使用して、同時タスクと非同期タスクを効率的に処理するためのメカニズムを提供します。 1. 同時実行性は Goroutine によって実現され、複数のタスクを同時に実行できます。 2. 非同期プログラミングはチャネルを通じて実装されます。メインスレッドをブロックせずに実行可能。 3. HTTP リクエストの同時処理、データベース データの非同期取得などの実用的なシナリオに適しています。

JS-Torch の概要 JS-Torch は、構文が PyTorch に非常に似ている深層学習 JavaScript ライブラリです。これには、完全に機能するテンソル オブジェクト (追跡された勾配で使用可能)、深層学習レイヤーと関数、および自動微分エンジンが含まれています。 JS-Torch は JavaScript での深層学習の研究に適しており、深層学習の開発を加速するための便利なツールや機能を多数提供します。 Image PyTorch は、Meta の研究チームによって開発および保守されているオープンソースの深層学習フレームワークです。ニューラル ネットワーク モデルを構築およびトレーニングするための豊富なツールとライブラリのセットを提供します。 PyTorch は、シンプル、柔軟、そして使いやすいように設計されており、その動的な計算グラフ機能により、
