Heim  >  Artikel  >  Web-Frontend  >  Eine eingehende Analyse des Rückrufs in der asynchronen Programmierung von Node.js

Eine eingehende Analyse des Rückrufs in der asynchronen Programmierung von Node.js

青灯夜游
青灯夜游nach vorne
2021-07-06 11:30:182646Durchsuche

Das Operationsergebnis der nicht blockierenden E/A erfordert zum Empfang eine Rückruffunktion. Der folgende Artikel stellt Ihnen den Rückruf in der asynchronen Node.js-Programmierung im Detail vor.

Eine eingehende Analyse des Rückrufs in der asynchronen Programmierung von Node.js【Empfohlene Studie: „

nodejs-Tutorial

“】Die laufenden Ergebnisse nicht blockierender E/A müssen von Rückruffunktionen empfangen werden. Diese Methode zur Verwendung von Rückruffunktionen ist asynchrone Programmierung!

Asynchroner Programmierfall eins

function interview(callback) {
  setTimeout(() => {
    callback("success");
  }, 1000);
}

interview(function (res) {
  if (res === "success") {
    console.log("============我笑了");
  }
});

Spezifikation des Rückruffunktionsformats

error-first callbak
  • Knotenstil-Rückruf
  • Der erste Parameter ist Fehler, und die folgenden Parameter sind das Ergebnis
Warum Der erste Parameter ist error

function interview(callback) {
  setTimeout(() => {
    if (Math.random() < 0.3) {
      callback("success");
    }
    throw new Error("fail");
  }, 1000);
}

try {
  interview(function (res) {
    if (res === "success") {
      console.log("============我笑了");
    }
  });
} catch (error) {
  console.log("fail", error);
}

Eine eingehende Analyse des Rückrufs in der asynchronen Programmierung von Node.jsIm obigen Code kann try Catch den von throw new Error('fail') ausgelösten Fehler nicht erfassen! , aber auf die JS-Globalseite geworfen! In Node.js sind globale Fehler sehr schwerwiegend und können zum Absturz des Programms führen!

Warum kann try Catch den throw in setTimeout nicht erfassen? Das hat etwas mit try catch并不能捕获 throw new Error('fail') 抛出的错误!,而是抛出到了 JS 全局! 在 Node.js 中,全局错误时非常严重的事情,会造成程序的崩溃!

为什么没 try catch 无法捕获 setTimeout 里面的 throw 呢? 这就跟调用栈事件循环有关系了!

每一个事件循环都是一个全新的调用栈! setTimeoutAufrufstapel und

Ereignisschleife

zu tun!

Jede Ereignisschleife ist ein brandneuer Aufrufstapel und interview sind zwei verschiedene Ereignisschleifen!

Aber dieses Problem kann gelöst werden, indem ein Fehler in den Parametern der Rückruffunktion ausgegeben wird

function interview(callback) {
  setTimeout(() => {
    if (Math.random() < 0.3) {
      callback(null, "success");
    } else {
      callback(new Error("fail"));
    }
  }, 1000);
}

interview(function (error) {
  if (error) {
    return console.log("============我哭了");
  }
  console.log("============我笑了");
});

Im obigen Code können Sie anhand des Parametertyps beurteilen, ob ein Fehler vorliegt! Aber es gibt viele Rückruffunktionen in Node.js, und wir können nicht beurteilen, ob der Parametertyp in jeder Funktion falsch ist!

Node.js legt fest, dass der erste Parameter ein Fehler und der zweite Parameter das Ergebnis ist! Ist der erste Parameter nicht leer, liegt ein Fehler beim asynchronen Aufruf vor!

Probleme mit der asynchronen Prozesssteuerung

Callback Hell

Die Situation mehrerer asynchroner Aufgaben nacheinander.

rreee

Sie können sehen, dass der obige asynchrone Prozess in drei Ebenen eingebettet ist Dies ist nur ein Fall, in dem der Code relativ einfach ist! In tatsächlichen Anwendungen kann jede verschachtelte Funktion sehr komplex sein, was die Entwicklung und Wartung erschwert und die Leute beim Betrachten wütend macht. Dies ist die sogenannte ** Rückrufhölle **

a

Mehrere Personen Die Situation der Parallelität asynchroner Aufgaben

function interview(callback) {
  setTimeout(() => {
    if (Math.random() < 0.6) {
      callback(null, "success");
    } else {
      callback(new Error("fail"));
    }
  }, 1000);
}

interview(function (error) {
  if (error) {
    return console.log("======第一轮面试======我哭了");
  }

  interview(function (error) {
    if (error) {
      return console.log("====第二轮面试========我哭了");
    }

    interview(function (error) {
      if (error) {
        return console.log("====第三轮面试========我哭了");
      }

      console.log("三轮面试都成功了!啊哈哈哈!");
    });
  });
});
    Die gleiche Variable muss jeder asynchronen Aufgabe hinzugefügt werden, um die Ergebnisse mehrerer asynchroner Aufgaben zu erfassen
  • Lösen Sie das Steuerungsproblem asynchroner Prozesse

Versprechen

asynchrones Warten🎜 🎜🎜Mehr Weiteres Wissen zum Thema Programmierung finden Sie unter: 🎜Programmiervideos🎜! ! 🎜

Das obige ist der detaillierte Inhalt vonEine eingehende Analyse des Rückrufs in der asynchronen Programmierung von Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen