Node.js事件循环(Event Loop)和线程池详解

2020-06-17 06:54:56易采站长站整理

另一个问题是触发Error(异常)。找出您应用程序中的问题已经很难了,但没了调用堆栈(注* e.stack),则几乎不可能调试。当Error被远端的异步请求调用堆栈将丢失。有两个可行的解决方案:同步触发或确保Error跟其他重要信息一起传入。下面的例子演示了这两种解决方案:

MyThing.prototype.foo = function foo() {
  // 这个 error 会被异步触发
  var er = doFirstThing();
  if (er) {
    // 在触发时,需要创建一个新的保留现场调用堆栈信息的error
    setImmediate(emitError, this, new Error(‘Bad stuff’));
    return;
  }

  // 触发error,马上处理(同步)
  var er = doSecondThing();
  if (er) {
    this.emit(‘error’, ‘More bad stuff’);
    return;
  }
}
审时度势。当error被触发时,是有可能被立即处理的。或者,它可能是一些琐碎的,可以很容易处理,或在以后再处理的异常。此外通过一个构造函数,传递Error也不是一个好主意,因为构造出来的对象实例很有可能是不完整的。刚才直接抛出Error的情况是个例外。

结束语

这篇文章比较浅显地探讨了有关事件循环的内部运作机制和技术细节。都是经过深思熟虑的。另一篇文章会讨论事件循环与系统内核的交互,并展现NodeJS异步运行的魔力。