拒绝未定义的承诺
reject in promise undefined
我在下面的函数中尝试使用 co
和 javascript 承诺测试,fulfill
会成功 return 但 reject
不会,并捕获未定义的错误。并且流程无法继续。为什么?
错误:
> at GeneratorFunctionPrototype.next (native)
at onFulfilled (/Users/../project/app/node_modules/co/index.js:65:19)
at runMicrotasksCallback (node.js:337:7)
at process._tickDomainCallback (node.js:381:11)
代码:
domain.run(function() {
var testPromise = function() {
return new Promise(function (fulfill, reject){
//reject('error');
reject(new Error('message'));
});
};
co(function *() {
var d = yield testPromise();
console.log(d);
res.send('fin');
}).catch(onerror);
function onerror(error) { console.error(error.stack); }
});
domain.on('error', function(error) { console.error(error); });
catch error undefined
没有。它捕获错误 'error'
,您拒绝的值。当然,它并不是真正的 Error
,而是一个字符串,因此它没有 .stack
属性 - 这就是它记录 undefined
的原因。通过
修复您的代码
reject(new Error('…'));
另见 Should a Promise.reject message be wrapped in Error?
the flow can't continue. why?
嗯,因为你有一个错误,抛出 exceptions 确实有这种行为。您还需要在错误处理程序中发送响应!
co(function *() {
…
}).catch(function onerror(error) {
console.error(error.stack);
res.send('err');
});
或者,如果您打算在调用时继续流程,请将 .catch
处理程序放在那里:
co(function *() {
yield testPromise().then(function(d) {
console.log(d);
}).catch(function(error) {
console.error(error.stack);
});
res.send('fin');
});
或者,将您的 promise 调用包装在 try-catch 中:
co(function *() {
try {
var d = yield testPromise();
console.log(d);
} catch(error) {
console.error(error.stack);
}
res.send('fin');
});
我在下面的函数中尝试使用 co
和 javascript 承诺测试,fulfill
会成功 return 但 reject
不会,并捕获未定义的错误。并且流程无法继续。为什么?
错误:
> at GeneratorFunctionPrototype.next (native)
at onFulfilled (/Users/../project/app/node_modules/co/index.js:65:19)
at runMicrotasksCallback (node.js:337:7)
at process._tickDomainCallback (node.js:381:11)
代码:
domain.run(function() {
var testPromise = function() {
return new Promise(function (fulfill, reject){
//reject('error');
reject(new Error('message'));
});
};
co(function *() {
var d = yield testPromise();
console.log(d);
res.send('fin');
}).catch(onerror);
function onerror(error) { console.error(error.stack); }
});
domain.on('error', function(error) { console.error(error); });
catch error undefined
没有。它捕获错误 'error'
,您拒绝的值。当然,它并不是真正的 Error
,而是一个字符串,因此它没有 .stack
属性 - 这就是它记录 undefined
的原因。通过
reject(new Error('…'));
另见 Should a Promise.reject message be wrapped in Error?
the flow can't continue. why?
嗯,因为你有一个错误,抛出 exceptions 确实有这种行为。您还需要在错误处理程序中发送响应!
co(function *() {
…
}).catch(function onerror(error) {
console.error(error.stack);
res.send('err');
});
或者,如果您打算在调用时继续流程,请将 .catch
处理程序放在那里:
co(function *() {
yield testPromise().then(function(d) {
console.log(d);
}).catch(function(error) {
console.error(error.stack);
});
res.send('fin');
});
或者,将您的 promise 调用包装在 try-catch 中:
co(function *() {
try {
var d = yield testPromise();
console.log(d);
} catch(error) {
console.error(error.stack);
}
res.send('fin');
});