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”事件,并且可能在您实际完成数据处理之前调用。。。。。。。。。。。。。。。。。!美好的