Node.js adalah berdasarkan enjin JavaScript v8 dan berbenang tunggal. Node.js menggunakan kaedah pengaturcaraan tak segerak yang serupa dengan JavaScript di Web untuk mengendalikan operasi I/O yang menyekat. Membaca fail, mengakses pangkalan data, permintaan rangkaian, dsb. dalam Node.js semuanya mungkin tidak segerak. Bagi mereka yang baru menggunakan Node.js atau pembangun yang berhijrah ke Node.js daripada latar belakang bahasa lain, pengaturcaraan tak segerak adalah bahagian yang menyakitkan. Bab ini akan memperkenalkan anda kepada semua aspek pengaturcaraan tak segerak Node.js daripada yang paling mudah kepada yang lebih mendalam. Daripada panggilan balik yang paling asas kepada thunk, Promise, co kepada async/menunggu yang dirancang untuk ES7.
Pertama, mari kita mulakan dengan contoh khusus pengaturcaraan tak segerak.
Dapatkan maklumat cuaca untuk berbilang lokasi IP
Dalam fail ip.json, terdapat tatasusunan di mana kami menyimpan beberapa alamat IP, yang merupakan pelawat yang berbeza dari tempat yang berbeza Kandungannya adalah seperti berikut:
// ip.json
["115.29.230.208", "180.153.132.38", "74.125.235.224", "91.239.201.98", "60.28.215.115"]
Saya harap saya boleh mendapatkan cuaca semasa untuk setiap lokasi IP. Keluarkan keputusan ke fail weather.json dalam format berikut:
// weather.json
[
{ "ip": "115.29.230.208", "cuaca": "Awan", "rantau": "Zhejiang" },
{ "ip": "180.153.132.38", "cuaca": "Jelas", "rantau": "Shanghai" },
{ "ip": "74.125.235.224", "cuaca": "Hujan", "rantau": "California" },
{ "ip": "60.28.215.115", "cuaca": "Jelas", "rantau": "Tianjin" }
]
Untuk menyusun pemikiran kami, kami membahagikannya kepada langkah-langkah berikut:
1. Baca alamat ip;
2. Dapatkan lokasi geografi IP berdasarkan alamat IP;
3. Semak cuaca tempatan berdasarkan lokasi geografi;
4. Tulis keputusan ke fail weather.json.
Langkah ini semuanya tak segerak (membaca dan menulis fail boleh segerak, tetapi sebagai contoh, tak segerak digunakan).
panggil balik
Pertama, kami cuba melaksanakannya mengikut cara yang biasanya disediakan oleh Node.js API - menghantar panggilan balik sebagai panggilan balik tak segerak tanpa menggunakan sebarang pustaka. Kami akan menggunakan tiga modul asas:
1.fs: Baca senarai IP daripada fail ip.json; 2.permintaan: digunakan untuk menghantar permintaan HTTP, mendapatkan data geo berdasarkan alamat IP, dan kemudian mendapatkan data cuaca melalui data geo; 3.querystring: digunakan untuk memasang parameter url untuk menghantar permintaan.Buat fail callback.js baharu dan perkenalkan modul ini:
Salin kod
Baca senarai IP dalam fail, panggil fs.readFile untuk membaca kandungan fail, dan kemudian gunakan JSON.parse untuk menghuraikan data JSON:
Salin kod
} lain {
Cuba {
data = JSON.parse(data)
panggil balik(null, data)
} tangkap (ralat) {
panggil balik(ralat)
}
}
})
}
...
Langkah seterusnya ialah menggunakan IP untuk mendapatkan geo Kami menggunakan permintaan untuk meminta perkhidmatan geo terbuka:
Salin kod
json: benar
}, fungsi(err, resp, body) {
panggil balik(err, body)
})
}
...
Gunakan data geo untuk mendapatkan cuaca:
...
fungsi geo2weather(lat, lon, panggil balik) {
var params = {
lat: lat,
lon: lon,
APPID: '9bf4d2b07c7ddeb780c5b32e636c679d'
}
var url = 'http://api.openweathermap.org/data/2.5/weather?' qs.stringify(params)
permintaan ({
url: url,
json: benar,
}, fungsi(err, resp, body) {
panggil balik(err, body)
})
}
...
Memandangkan kami telah memperoleh antara muka untuk geo dan cuaca, kami masih mempunyai masalah yang lebih rumit untuk ditangani Kerana terdapat berbilang IP, kami perlu membaca geo secara selari dan membaca data cuaca secara selari:
...
fungsi ips2geos(ips, panggil balik) {
var geos = []
var ip
var kekal = ips.length
untuk (var i = 0; i ip = ips[i];
(fungsi(ip) {
ip2geo(ip, fungsi(err, geo) {
Jika (err) {
panggil balik(err)
} lain {
geo.ip = ip
geos.push(geo)
kekal--
}
Jika (kekal == 0) {
panggil balik(null, geos)
}
})
})(ip)
}
}
fungsi geos2weathers(geos, panggil balik) {
var weathers = []
var geo
var kekal = geos.length
untuk (var i = 0; i
Geo = geos[i];
(fungsi(geo) {
geo2weather(geo.latitud, geo.longitud, fungsi(err, cuaca) {
Jika (err) {
panggil balik(err)
} lain {
weather.geo = geo
cuaca.tolak(cuaca)
kekal--
}
Jika (kekal == 0) {
panggil balik(null, weathers)
}
})
})(geo)
}
}
...
Kedua-dua ips2geos dan geos2weathers menggunakan kaedah yang agak primitif, kekal untuk mengira bilangan item yang menunggu untuk dipulangkan Jika kekal ialah 0, ini bermakna permintaan selari telah tamat dan hasil pemprosesan dimuatkan ke dalam tatasusunan dan dikembalikan. .
Langkah terakhir ialah menulis keputusan ke dalam fail weather.json:
...
fungsi writeWeather(cuaca, panggil balik) {
var output = []
cuaca var
untuk (var i = 0; i cuaca = cuaca[i]
Output.push({
IP: weather.geo.ip,
Cuaca: weather.weather[0].utama,
Rantau: weather.geo.region
})
}
fs.writeFile('./weather.json', JSON.stringify(output, null, ' '), panggil balik)
}
...
Dengan menggabungkan fungsi di atas, kami boleh mencapai matlamat kami:
...
fungsi pengendaliRalat(err) {
console.log('error: ' err)
}
readIP('./ip.json', function(err, ips) {
jika (err) {
handlerError(err)
} lain {
ips2geos(ips, fungsi(err, geos) {
jika (err) {
handlerError(err)
} lain {
geos2weathers(geos, fungsi(err, cuaca) {
jika (err) {
handlerError(err)
} lain {
writeWeather(cuaca, fungsi(err) {
jika (err) {
handlerError(err)
} lain {
console.log('berjaya!')
}
})
}
})
}
})
}
})
哈哈,你妈这嵌套,你可能觉得这就是 JavaScript 异步的问题,说真的,嵌套不是 JavaScript 异步的问题,说真的,嵌套不是 JavaScript 异步的问题。这段代码我们可以下面这样写:
...
fungsi ReadIPCallback(err, ips) {
jika (err) {
handlerError(err)
} lain {
ips2geos(ips, ips2geosCallback)
}
}
fungsi ips2geosCallback(err, geos) {
jika (err) {
handlerError(err)
} lain {
geos2weathers(geos, geos2weathersCallback)
}
}
fungsi geos2weathersCallback(err, weathers) {
jika (err) {
handlerError(err)
} lain {
writeWeather(cuaca, tulisWeatherCallback)
}
}
fungsi writeWeatherCallback(err) {
jika (err) {
handlerError(err)
} lain {
console.log('berjaya!')
}
}
readIP('./ip.json', ReadIPCallback)
好了,这是我们 panggilan balik.js 的全部内容。运行:
nod panggil balik.js
将会生成 weater.json 文件:
[
{
"ip": "180.153.132.38",
"cuaca": "Jelas",
"rantau": "Shanghai"
},
{
"ip": "91.239.201.98",
"cuaca": "Awan"
},
{
"ip": "60.28.215.115",
"cuaca": "Jelas",
"rantau": "Tianjin"
},
{
"ip": "74.125.235.224",
"cuaca": "Awan",
"rantau": "California"
},
{
"ip": "115.29.230.208",
"cuaca": "Jelas",
"wilayah": "Zhejiang"
}
]
Lalu apa masalah sebenarnya?
Sudah tentu ia adalah masalah asynchronous pada asasnya perlu berurusan dengan tiga perkara:
1. Apabila operasi asynchronous tamat, ia perlu dimaklumkan semula ialah penyelesaian
2. Hasil yang dijana secara tidak segerak perlu dihantar kembali menerima parameter data dan menghantar kembali data;
3. Apakah yang perlu saya lakukan jika ralat tak segerak berlaku? Panggilan balik menerima parameter ralat dan mengembalikan ralat.

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

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

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

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

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

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

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

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


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Dreamweaver CS6
Alat pembangunan web visual

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Penyesuai Pelayan SAP NetWeaver untuk Eclipse
Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

mPDF
mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular
