问题描述
我对使用Bluebird Promise相当陌生.我试图在发射器上使用它们.但是,我坚持如何处理错误.
I am fairly new with using Bluebird promises. I was trying to use them over an emitter. However, I am stuck on how to handle errors.
我有一个stream
对象,它是发射器.代码如下-
I have a stream
object which is the emitter. Code is as below -
return new Promise((resolve, reject) => {
var onDocFunc = doc => {
//JSON.parse('*');
// some logic goes in here to construct setStmt
bulk.find(query).upsert().update({$set: setStmt});
count++;
if (count % bulkSize == 0) {
stream.pause();
var execute = Promise.promisify(bulk.execute);
execute().catch(() => {}).then(() => {
stream.resume();
});
}
};
stream.on('data', onDocFunc);
stream.on('end', () => {
JSON.parse('*'); // how to catch errors that happen here??
var boundResolve = resolve.bind(this, {count: count});
if (count % bulkSize != 0) {
Promise.promisify(bulk.execute)().then(boundResolve).catch(boundResolve);
}
else {
boundResolve();
}
});
stream.on('error', err => {
reject(err);
});
})
我想知道捕获end
事件处理程序的回调内部发生的错误的推荐方法是什么?现在,如果发生任何错误,NodeJS应用程序将崩溃,并显示uncaughtException: Unexpected token *
I want to know what is the recommended way to catch an error which occurs inside the callback of the end
event handler? Right now if any error occurs, the NodeJS application crashes with uncaughtException: Unexpected token *
推荐答案
不要将应用程序逻辑混入事件发射器的混杂中.此类代码(可能会抛出等)应始终放在then
回调中.就您而言:
Don't mix application logic into the promisification of the event emitter. Such code (that can throw etc) should always go in then
callbacks. In your case:
var execute = Promise.promisify(bulk.execute);
return new Promise((resolve, reject) => {
stream.on('data', onDocFunc); // not sure what this does
stream.on('end', resolve);
stream.on('error', reject);
}).then(() => {
JSON.parse('*'); // exceptions that happen here are caught implicitly!
var result = {count: count};
if (count % bulkSize != 0) {
return execute().catch(()=>{}).return(result);
} else {
return result;
}
});
关于您的真实代码,我可能会尝试将批处理因素分解为一个辅助函数:
Regarding your real code, I'd probably try to factor out the batching into a helper function:
function asyncBatch(stream, size, callback) {
var batch = [], count = 0;
stream.on('data', data => {
batch.push(data);
count++;
if (batch.length == size) {
stream.pause();
Promise.resolve(batch).then(callback).then(() => {
batch = [];
stream.resume();
}, e => {
stream.emit('error', e);
});
}
});
return new Promise((resolve, reject) => {
stream.on('end', resolve);
stream.on('error', reject);
}).then(() => batch.length ? callback(batch) : null).then(() => count);
}
Promise.promisifyAll(Bulk);
return asyncBatch(stream, bulkSize, docs => {
const bulk = new Bulk()
for (const doc of docs) {
// JSON.parse('*');
// some logic goes in here to construct setStmt
bulk.find(query).upsert().update({$set: setStmt});
}
return bulk.executeAsync().catch(err => {/* ignore */});
})
这篇关于蓝鸟承诺与事件发射器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!