Seperti yang kita semua tahu, asinkron adalah fitur dan keuntungan unik, tetapi pada saat yang sama, kebutuhan akan sinkronisasi dalam program (misalnya, urutan eksekusi program kontrol adalah: func1 -> func2 -> func3) juga sangat umum. Artikel ini mencatat beberapa pemikiran saya tentang masalah ini.
Fungsi yang akan dieksekusi:
Salinan kode adalah sebagai berikut:
var func1 = fungsi (req, res, callback) {
setTimeout (function () {
console.log ('in func1');
Callback (Req, Res, 1);
}, 13000);
}
var func2 = fungsi (req, res, callback) {
setTimeout (function () {
console.log ('in func2');
Callback (Req, Res, 2);
}, 5000);
}
var func3 = fungsi (req, res, callback) {
setTimeout (function () {
console.log ('in func3');
Callback (Req, Res, 3);
}, 1000);
}
Dapat dilihat bahwa di Func1, Func2 dan Func3, waktu eksekusi masing -masing 13 detik, 5 detik dan 1 detik. Karena sifat nodej asinkron, jika Anda menggunakan metode panggilan fungsi biasa:
Salinan kode adalah sebagai berikut:
var req = null;
var res = null;
var callback = function () {};
func1 (req, res, callback);
func2 (req, res, callback);
func3 (req, res, callback);
Konten keluaran:
Salinan kode adalah sebagai berikut:
di func3
di func2
di func1
Alasannya adalah bahwa nodeJS asinkron, Func2 tidak akan menunggu Func1 dieksekusi sebelum dieksekusi, tetapi akan segera dieksekusi (dan demikian pula func3). Karena Func3 memiliki waktu berjalan terpendek, itu berakhir lebih dulu, Func2 dan Func1 terakhir. Tapi ini jelas bukan hasil yang kita inginkan. Apa yang harus dilakukan?
Solusi 1: Callback
Salinan kode adalah sebagai berikut:
// bersarang yang dalam
var req = null;
var res = null;
func1 (req, res, function () {
func2 (req, res, function () {
func3 (req, res, function () {
Process.exit (0);
})
});
});
Meskipun metode ini dapat diselesaikan dengan cepat, masalah yang terbuka juga jelas. Pertama, pemeliharaan kode tidak ada di tempat, dan kedua, sarang dalam kode yang dalam terlihat tidak nyaman. Metode ini tidak disarankan.
Solusi 2: Panggilan Rekursif
Salinan kode adalah sebagai berikut:
fungsi executefunc (funcs, count, sum, req, res) {
if (count == sum) {
kembali ;
}
kalau tidak{
funcs [count] (req, req, function () {
Count ++;
ExecutEfunc (Funcs, Count, Sum, Req, Res);
});
}
}
// panggilan sinkron
var req = null;
var res = null;
var funcs = [func1, func2, func3];
var len = func.length;
ExecutEfunc (Funcs, 0, Len, Req, Res);
Pertama, beberapa fungsi dibentuk menjadi array. Anda kemudian dapat menggunakan karakteristik fungsi rekursif untuk membuat program dieksekusi dalam urutan tertentu.
Solusi 3: Hubungi Perpustakaan Kelas
Dengan pengembangan nodej, ada semakin banyak perpustakaan kelas yang merespons. Langkah dan async adalah yang baik.
1. Panggilan untuk melangkah relatif menyegarkan:
Salinan kode adalah sebagai berikut:
Melangkah(
function theFunc1 () {
func1 (ini);
},
function theFunc2 (finishflag) {
console.log (finishflag);
func2 (ini);
},
function theFunc3 (finishflag) {
console.log (finishflag);
}
);
2. Metode seri Async, dalam hal ini, metode panggilannya:
Salinan kode adalah sebagai berikut:
var req = null;
var res = null;
var callback = function () {};
async.series (
[
function (callback) {
func1 (req, res, callback);
},
function (callback) {
func2 (req, res, callback);
},
function (callback) {
func3 (req, res, callback);
}
]
);