webentwicklung-frage-antwort-db.com.de

Blockiert async/await die Ereignisschleife?

Ich habe Blockiere nicht die Ereignisschleife aus dem Node.js-Handbuch gelesen. In einer Zeile stand:

Sie sollten sicherstellen, dass Sie die Ereignisschleife niemals blockieren. Mit anderen Worten, jeder JavaScript-Rückruf sollte schnell ausgeführt werden. Dies gilt natürlich auch für Ihre await, Ihre Promise.then usw.

Ich habe mich gefragt, was passiert, wenn ein API-Aufruf der Datenbank, für deren Auflösung ich await bin, einige Zeit in Anspruch nimmt. Bedeutet das, dass ich die Ereignisschleife mit diesem await-Aufruf blockiert habe?

Danach habe ich angefangen, einige selbstgeschriebene Codes zu testen, aber nach dem Testen ist mir immer noch nicht klar, wie das Blockieren durch await funktioniert. Hier sind einige Testcodes:

Vorausgesetzt, ich benutze Express zum Testen. Ich verstehe, warum 2 API-Aufrufe an die Route /test in diesem Fall die Ereignisschleife blockieren.

function someHeavyWork() {
  // like calling pbkdf2 function
}

app.get('/test', (req, res) => {
  someHeavyWork();
  res.json(data);
});

Aber das passiert in diesem Fall nicht.

function fakeDBCall() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(data);
    }, 5000)
  })
}

app.get('/test', async (req, res) => {
  const data = await fakeDbCall();
  res.json(data);
})

Dies kann daran liegen, dass ich nicht verstehe, wie das Blockieren im Fall von async/await funktioniert.

4
Mohammad Aziz

Im Gegensatz zu dem, was es scheint, blockiert await nicht. Es ist nursyntaktischer Zuckerüber Versprechen. Nichts ist blockiert; Es mag blockierend aussehen, um zuzulassen, dass Code synchron ist, aber das ist nur Zucker über Versprechungen. Dies kann beispielsweise synchron aussehen:

const response = await fetch(…);
const json = await response.json();
const foo = JSON.parse(json); // Using json here, even though my request was async!

Aber es ist nicht. Sobald du es desugarst, bekommst du nur Versprechen, die nicht blockieren:

fetch(…)
  .then(response => response.json())
  .then(json => {
    const foo = JSON.parse(json);
  });

Es wäre absolut katastrophal, wenn await blocken würde. JavaScript-Laufzeiten sind in der Regel Single-Threaded. Dies bedeutet, dass die Benutzerinteraktion und andere Prozesse immer dann unterbrochen werden, wenn Sie eine Anforderung oder eine andere asynchrone Operation ausführen, z. B. die Verwendung des Dateisystems. In einem ähnlichen Zusammenhang ist dies zusammen mit dynamischen Importen das Hauptargument gegen die oberste Ebene await

16
Li357

wait blockiert nicht den Eventloop. In der Tat, wenn Javascript Ihre await sieht, wird es die Kontrolle sofort wieder an die Ereignisschleife übergeben.

0
Evert

Die asynchrone Funktion gibt ein Versprechen zurück und Sie übergeben die Anfrage und die Antwort. Ich würde die res.json (Daten) ändern, um res.json (Daten) zurückzugeben.

Wenn eine asynchrone Funktion einen Wert zurückgibt, wird das Versprechen aufgelöst. Wenn die Funktion einen Fehler enthält, wird das Versprechen nur aus Gründen der Sauberkeit abgelehnt. Die Rückgabe des res.json (Daten) löst die Funktion auf.

0