Wie wir alle wissen, ist Asynchronous ein einzigartiges Merkmal und einen einzigartigen Vorteil, aber gleichzeitig ist der Bedarf an Synchronisation in Programmen (z. B. die Ausführungsreihenfolge des Steuerungsprogramms ist: Func1 -> Func2 -> Func3) auch sehr häufig. In diesem Artikel werden einige meiner Gedanken zu diesem Thema aufgezeichnet.
Funktionen, die ausgeführt werden sollen:
Die Codekopie lautet wie folgt:
var func1 = function (req, res, callback) {
setTimeout (function () {
console.log ('in func1');
Rückruf (Req, Res, 1);
}, 13000);
}
var func2 = function (req, res, callback) {
setTimeout (function () {
console.log ('in func2');
Rückruf (Req, Res, 2);
}, 5000);
}
var func3 = function (req, res, callback) {
setTimeout (function () {
console.log ('in func3');
Rückruf (Req, Res, 3);
}, 1000);
}
Es ist ersichtlich, dass in Func1, Func2 und Func3 die Ausführungszeit 13 Sekunden, 5 Sekunden bzw. 1 Sekunde beträgt. Aufgrund der asynchronen Natur von NodeJs, wenn Sie normale Funktionsaufrufmethoden verwenden:
Die Codekopie lautet wie folgt:
var req = null;
var res = null;
var callback = function () {};
Func1 (Req, Res, Callback);
Func2 (Req, Res, Callback);
Func3 (Req, Res, Callback);
Ausgabeinhalt:
Die Codekopie lautet wie folgt:
in func3
in func2
in func1
Der Grund dafür ist, dass NodeJS asynchron ist. Da Func3 die kürzeste Laufzeit hat, endet es zuerst, Func2 und Func1 zuletzt. Aber dies ist offensichtlich nicht das Ergebnis, das wir wollen. was zu tun?
Lösung 1: Rückruf
Die Codekopie lautet wie folgt:
// tiefes Nisting
var req = null;
var res = null;
func1 (req, res, function () {
func2 (req, res, function () {
func3 (req, res, function () {
process.exit (0);
})
});
});
Obwohl diese Methode schnell gelöst werden kann, sind auch die exponierten Probleme offensichtlich. Erstens ist die Codewartung nicht vorhanden, und zweitens sieht die tiefe Verschachtelung des Codes unangenehm aus. Diese Methode ist nicht ratsam.
Lösung 2: Rekursiver Anruf
Die Codekopie lautet wie folgt:
Funktion executeFunc (funcs, count, sum, req, res) {
if (count == sum) {
zurückkehren ;
}
anders{
funcs [count] (req, req, function () {
zählen ++;
executeFunc (funcs, count, sum, req, res);
});
}
}
// Synchroner Anruf
var req = null;
var res = null;
var funcs = [func1, func2, func3];
var len = funcs.length;
executeFunc (funcs, 0, len, req, res);
Zunächst werden mehrere Funktionen in ein Array gebildet. Sie können dann die Eigenschaften rekursiver Funktionen verwenden, um das Programm in einer bestimmten Reihenfolge auszuführen.
Lösung 3: Rufen Sie die Klassenbibliothek an
Mit der Entwicklung von NodeJs gibt es immer mehr Klassenbibliotheken, die reagieren. Schritt und asynchronen sind die guten.
1. Der Schritt zum Schritt ist relativ erfrischend:
Die Codekopie lautet wie folgt:
Schritt(
Funktion theFunc1 () {
func1 (this);
},
Funktion theFunc2 (Finishflag) {
console.log (Finishflag);
func2 (this);
},
Funktion theFunc3 (Finishflag) {
console.log (Finishflag);
}
);
2. Asyncs Serienmethode in diesem Fall seine aufrufende Methode:
Die Codekopie lautet wie folgt:
var req = null;
var res = null;
var callback = function () {};
async.series (
[
Funktion (Rückruf) {
Func1 (Req, Res, Callback);
},
Funktion (Rückruf) {
Func2 (Req, Res, Callback);
},
Funktion (Rückruf) {
Func3 (Req, Res, Callback);
}
]
);