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 パラメータを受け入れ、エラーを返します。

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

本篇文章带大家详解package.json和package-lock.json文件,希望对大家有所帮助!

如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node.js项目打包为可执行文件的方法,希望对大家有所帮助!

本篇文章给大家分享一个Nodejs web框架:Fastify,简单介绍一下Fastify支持的特性、Fastify支持的插件以及Fastify的使用方法,希望对大家有所帮助!

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

先介绍node.js的安装,再介绍使用node.js构建一个简单的web服务器,最后通过一个简单的示例,演示网页与服务器之间的数据交互的实现。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

WebStorm Mac版
便利なJavaScript開発ツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ホットトピック



