Heim  >  Artikel  >  Web-Frontend  >  So optimieren Sie die asynchrone Node-Async/Await-Programmierung

So optimieren Sie die asynchrone Node-Async/Await-Programmierung

php中世界最好的语言
php中世界最好的语言Original
2018-05-30 14:52:041067Durchsuche

Dieses Mal zeige ich Ihnen, wie Sie die asynchrone Knoten-Async/Await-Programmierung optimieren können. Lasst uns zusammenkommen. 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 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:

Wie React die Anmeldeüberprüfungskontrolle im React-Router-Routing implementiert

Der Routing-Schutz im Angular-Routing So verwenden Sie

Das obige ist der detaillierte Inhalt vonSo optimieren Sie die asynchrone Node-Async/Await-Programmierung. 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