Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Erläuterung der asynchronen Programmierimplementierung Node Async/Await

Detaillierte Erläuterung der asynchronen Programmierimplementierung Node Async/Await

php中世界最好的语言
php中世界最好的语言Original
2018-05-22 11:46:302081Durchsuche

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

Javascript

asynchrone 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

Objekt

bis 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);
 });
}
2. Warten bedeutet, auf das Versprechen zu warten, das Ergebnis zurückzugeben, bevor die Ausführung fortgesetzt wird.

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`
  }
};
Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!

Empfohlene Lektüre:

Vue-berechnete Eigenschaften und Listener-Case-Code-Analyse

Detaillierte 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn