Dieses Mal erkläre ich Ihnen ausführlich die Implementierung der asynchronen Programmierung des Knotens Async/Await , lasst uns gemeinsam einen Blick darauf werfen Schaut mal rein.
1. Die ultimative Lösung für asynchrone Programmierung Vor ein paar Tagen habe ich einen Artikel über
Javascriptasynchrone Operationen geschrieben " Ausführliche Erklärung von Javascript Promise. Als ich kürzlich Puppeteer lernte, entdeckte ich eine andere asynchrone Programmierlösung: Async/Await. Ein Programm, das versucht, dieses Problem zu lösen. Von der frühesten Rückruffunktion über das Promise
Objektbis hin zur Generatorfunktion gibt es jedes Mal Verbesserungen, aber es fühlt sich unvollständig an. Sie alle weisen zusätzliche Komplexitäten auf und erfordern ein Verständnis der zugrunde liegenden Betriebsmechanismen der Abstraktion. Nachdem die Async-Funktion herauskam, dachten einige Leute, sie sei die ultimative Lösung für die asynchrone Programmierung. Denn bei Async/Await müssen Sie sich keine Gedanken darüber machen, ob es sich um eine asynchrone Programmierung handelt.
2. Grundlegende Verwendung
Die asynchrone Funktion gibt ein Promise-Objekt zurück, und Sie können die Methode then verwenden, um eine Rückruffunktion hinzuzufügen. Wenn die Funktion ausgeführt wird und auf das Warten stößt, kehrt sie zuerst zurück, wartet, bis der ausgelöste asynchrone Vorgang abgeschlossen ist, und führt dann die nachfolgenden Anweisungen im Funktionskörper aus. Das Folgende ist eine Kastanie:
var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(function () { resolve(); }, time); }) }; var start = async function () { // 在这里使用起来就像同步代码那样直观 console.log('start'); await sleep(3000); console.log('end'); }; start();
Führen Sie den obigen Code aus. Sie werden feststellen, dass die Konsole zuerst start ausgibt und nach 3 Sekunden Wartezeit end ausgibt.
3. Hinweise
1. Der Befehl „await“ kann nur in asynchronen Funktionen verwendet werden gemeldet. async function dbFuc(db) {
let docs = [{}, {}, {}];
// 报错
docs.forEach(function (doc) {
await db.post(doc);
});
}
var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(function () { // 返回 ‘ok' resolve('ok'); }, time); }) }; var start = async function () { let result = await sleep(3000); console.log(result); // 收到 ‘ok' };
3. Auf „Warten“ sollte ein Versprechensobjekt folgen.
Wenn der Code synchron ausgeführt wird, ist keine Warteänderung erforderlich.
4. „await“ kann beispielsweise nur in nativer Syntax verwendet werden. Die Verwendung von „await“ in der forEeach-Struktur funktioniert beispielsweise nicht ordnungsgemäß und es muss die native Syntax der for-Schleife verwendet werden.
async function dbFuc(db) { let docs = [{}, {}, {}]; // 可能得到错误结果 docs.forEach(async function (doc) { await db.post(doc); }); }
Wenn Sie wirklich möchten, dass mehrere Anfragen gleichzeitig ausgeführt werden, können Sie die Promise.all-Methode verwenden.
async function dbFuc(db) { let docs = [{}, {}, {}]; let promises = docs.map((doc) => db.post(doc)); let results = await Promise.all(promises); console.log(results); }
4. Fehlererkennung
Da es keine Notwendigkeit gibt, .then(..) zu schreiben, besteht keine Notwendigkeit, zu schreiben .catch(..) entweder verwenden, können Sie direkt die standardmäßige Try-Catch-Syntax verwenden, um Fehler abzufangen. var sleep = function (time) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
// 模拟出错了,返回 ‘error'
reject('error');
}, time);
})
};
var start = async function () {
try {
console.log('start');
await sleep(3000); // 这里得到了一个返回错误
// 所以以下代码不会被执行了
console.log('end');
} catch (err) {
console.log(err); // 这里捕捉到错误 `error`
}
};
Empfohlene Lektüre:
Vue-berechnete Eigenschaften und Listener-Case-Code-AnalyseDetaillierte Erläuterung der Schritte zur gemeinsamen Verwendung von Vuex mit Komponenten
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der asynchronen Programmierimplementierung Node Async/Await. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!