9

我正在使用 nodejs 中的 winston 开发一个日志框架,我使用 Async 模块检查了 winston,但我需要验证它是否真的是异步性质的。

请建议。

4

1 回答 1

7

除了我知道它及其目的之外,我对 Winston 没有任何经验。在快速查看github 上的源代码后,我会说不,winston 在所有方面都不是真正的异步

  • 它确实emit,但EventEmitter不是异步的。
  • 方法具有异步风格的签名(w/ callback),但并不总是异步的。

没有 nextTickConsole传输调用callback- 它具有异步样式的签名,但它仍然在同一个刻度内,即:

Console.prototype.log = function (level, msg, meta, callback) {
  if (this.silent) {
    return callback(null, true);
  }
  //...
  if (level === 'error' || level === 'debug') {
    process.stderr.write(output + '\n');
  } else {
    process.stdout.write(output + '\n');
  }

  //
  // Emit the `logged` event immediately because the event loop
  // will not exit until `process.stdout` has drained anyway.
  //
  self.emit('logged');
  callback(null, true);
};

Logger类似于Console前面提到的,它立即发出回调 w/oa nextTick(或其他一些真正的异步操作)。它确实使用了该async模块,但这也不是在所有帐户上都是异步的,即:

  function cb(err) {
    if (callback) {
      if (err) return callback(err);
      callback(null, level, msg, meta);
    }
    callback = null;
    if (!err) {
      self.emit('logged', level, msg, meta);
    }
  }

  async.forEach(this._names, emit, cb);

我会告诉 Winston 它的File传输实际上是异步的,但仅仅是因为fsis .

无论如何,不​​要忘记“当目标是终端或文件时,控制台功能是同步的”。

于 2014-09-01T07:32:35.673 回答