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:
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
Salin kod
Salin kod
Gunakan data geo untuk mendapatkan cuaca:
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:
Dengan menggabungkan fungsi di atas, kami boleh mencapai matlamat kami:
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 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 的全部内容。运行:
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.