Javascript 如何使抛出的错误在承诺之外可见?

Javascript 如何使抛出的错误在承诺之外可见?,javascript,node.js,promise,Javascript,Node.js,Promise,我正在使用它进行流解析。对于每条记录,我需要调用一些函数mapper.process()。由于后一个函数返回一个promise,因此一个函数将其包装为co,并加上前缀yield parser.on('readable', function() { var record; while (record = parser.read()) { return co(function*() { yield mapper.process(record); }); }

我正在使用它进行流解析。对于每条记录,我需要调用一些函数
mapper.process()
。由于后一个函数返回一个promise,因此一个函数将其包装为
co
,并加上前缀
yield

parser.on('readable', function() {
  var record;
  while (record = parser.read()) {
    return co(function*() {
       yield mapper.process(record);
    });
  }
});
没有添加(删除第4行、第6行和
yield
),一切正常。但是,使用如上所示的解析器,抛出的错误将被忽略


如何修复此问题?

这里的问题是,任何抛出的错误都将消失,因为在co函数之后没有catch处理程序

但更重要的是,while循环中的return语句将导致整个函数返回,因此如果缓冲区中有多条记录,则无法访问它们

您可以编写以下代码使其正常工作:

parser.on('readable', function() {
  return co(function* () {
    var record;

    while (record = parser.read()) {
      const result = yield mapper.process(record);

      // do something with the result..
      console.log('result is ', result);
    }
  })
  .catch((err) => console.error(err));
});

但是,请注意,由于在“可读”回调中处理的是异步代码,因此会导致函数立即返回。此行为将导致解析器在流的末尾调用“finish”事件,并且可能在实际处理完数据之前调用。

这里的问题是,任何抛出的错误都将消失,因为在co函数之后没有catch处理程序

但更重要的是,while循环中的return语句将导致整个函数返回,因此如果缓冲区中有多条记录,则无法访问它们

您可以编写以下代码使其正常工作:

parser.on('readable', function() {
  return co(function* () {
    var record;

    while (record = parser.read()) {
      const result = yield mapper.process(record);

      // do something with the result..
      console.log('result is ', result);
    }
  })
  .catch((err) => console.error(err));
});

但是,请注意,由于在“可读”回调中处理的是异步代码,因此会导致函数立即返回。此行为将导致解析器在流的末尾调用“finish”事件,并且可能在您实际完成数据处理之前调用。。。。。。。。。。。。。。。。。!美好的