


Node.js Asynchronous Programming Callback Pengenalan (1)_node.js
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 < ips.length; 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 < geos.length; 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 < weathers.length; 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.

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

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Ringkasan: Pengaturcaraan tak segerak dalam C++ membenarkan berbilang tugas tanpa menunggu operasi yang memakan masa. Gunakan penunjuk fungsi untuk mencipta penunjuk kepada fungsi. Fungsi panggil balik dipanggil apabila operasi tak segerak selesai. Perpustakaan seperti boost::asio menyediakan sokongan pengaturcaraan tak segerak. Kes praktikal menunjukkan cara menggunakan penunjuk fungsi dan boost::asio untuk melaksanakan permintaan rangkaian tak segerak.

Fungsi JavaScript Pengaturcaraan Asynchronous: Kemahiran Penting untuk Mengendalikan Tugasan Kompleks Pengenalan: Dalam pembangunan front-end moden, pengendalian tugas yang kompleks telah menjadi bahagian yang amat diperlukan. Kemahiran pengaturcaraan tak segerak fungsi JavaScript adalah kunci untuk menyelesaikan tugas yang kompleks ini. Artikel ini akan memperkenalkan konsep asas dan kaedah praktikal biasa bagi pengaturcaraan tak segerak fungsi JavaScript, dan menyediakan contoh kod khusus untuk membantu pembaca memahami dan menggunakan teknik ini dengan lebih baik. 1. Konsep asas pengaturcaraan tak segerak Dalam pengaturcaraan segerak tradisional, kodnya ialah

Apabila aplikasi web menjadi lebih kompleks, pengaturcara terpaksa menggunakan pengaturcaraan tak segerak untuk mengendalikan sejumlah besar permintaan dan operasi I/O. PHP: HypertextPreprocessor tidak terkecuali. Untuk memenuhi keperluan ini, ReactPHP telah menjadi salah satu rangka kerja pengaturcaraan tak segerak yang paling popular untuk PHP. Dalam artikel ini, kita akan membincangkan cara melakukan pengaturcaraan tak segerak dalam PHP menggunakan ReactPHP. 1. Pengenalan kepada ReactPHP ReactPHP ialah pengaturcaraan berasaskan peristiwa

Cara melaksanakan pemprosesan mesej tak segerak dalam PHP Pengenalan: Dalam aplikasi web moden, pemprosesan mesej tak segerak menjadi semakin penting. Pemprosesan mesej tak segerak boleh meningkatkan prestasi dan kebolehskalaan sistem dan meningkatkan pengalaman pengguna. Sebagai bahasa pengaturcaraan sisi pelayan yang biasa digunakan, PHP juga boleh melaksanakan pemprosesan mesej tak segerak melalui beberapa teknologi. Dalam artikel ini, kami akan memperkenalkan beberapa kaedah untuk melaksanakan pemprosesan mesej tak segerak dalam PHP dan memberikan contoh kod. Menggunakan Baris Giliran Mesej Baris Gilir Mesej ialah cara menyahganding komponen sistem, membenarkan komponen berbeza

Pemahaman mendalam tentang ciri baharu PHP8: Bagaimana untuk menggunakan pengaturcaraan dan kod tak segerak dengan cekap? PHP8 ialah versi utama terkini bahasa pengaturcaraan PHP, membawakan banyak ciri baharu dan penambahbaikan yang menarik. Salah satu ciri yang paling menonjol ialah sokongan untuk pengaturcaraan tak segerak. Pengaturcaraan tak segerak membolehkan kami meningkatkan prestasi dan responsif apabila menangani tugas serentak. Artikel ini akan melihat secara mendalam ciri pengaturcaraan tak segerak PHP8 dan menerangkan cara menggunakannya dengan cekap. Pertama, mari kita fahami apa itu pengaturcaraan tak segerak. Dalam model pengaturcaraan segerak tradisional, kod mengikut urutan linear

3 masalah dan penyelesaian biasa dalam pengaturcaraan tak segerak dalam rangka kerja Java: Callback Hell: Gunakan Promise atau CompletableFuture untuk mengurus panggilan balik dalam gaya yang lebih intuitif. Perbalahan sumber: Gunakan primitif penyegerakan (seperti kunci) untuk melindungi sumber yang dikongsi dan pertimbangkan untuk menggunakan koleksi selamat benang (seperti ConcurrentHashMap). Pengecualian tidak terkendali: Mengendalikan pengecualian dalam tugas secara eksplisit dan menggunakan rangka kerja pengendalian pengecualian (seperti CompletableFuture.exceptionally()) untuk mengendalikan pengecualian.

Rangka kerja Go menggunakan ciri serentak dan tak segerak Go untuk menyediakan mekanisme untuk mengendalikan tugas serentak dan tak segerak dengan cekap: 1. Keselarasan dicapai melalui Goroutine, membolehkan berbilang tugasan dilaksanakan pada masa yang sama 2. Pengaturcaraan tak segerak dilaksanakan melalui saluran, yang boleh dilaksanakan tanpa menyekat utas utama Tugas 3. Sesuai untuk senario praktikal, seperti pemprosesan serentak permintaan HTTP, pemerolehan tak segerak data pangkalan data, dsb.

1. Mengapa menggunakan pengaturcaraan tak segerak? Pengaturcaraan tradisional menggunakan penyekatan I/O, yang bermaksud program menunggu operasi selesai sebelum meneruskan. Ini mungkin berfungsi dengan baik untuk satu tugasan, tetapi mungkin menyebabkan program menjadi perlahan apabila memproses sejumlah besar tugas. Pengaturcaraan tak segerak mematahkan batasan I/O penyekat tradisional dan menggunakan I/O bukan penyekat, yang bermaksud program itu boleh mengagihkan tugas kepada utas atau gelung peristiwa yang berbeza untuk dilaksanakan tanpa menunggu tugasan selesai. Ini membolehkan program mengendalikan berbilang tugas secara serentak, meningkatkan prestasi dan kecekapan program. 2. Asas pengaturcaraan tak segerak Python Asas pengaturcaraan tak segerak Python ialah coroutine dan gelung peristiwa. Coroutine ialah fungsi yang membenarkan fungsi bertukar antara menggantung dan menyambung semula. Gelung acara bertanggungjawab untuk penjadualan
