async.js 瀑布内未处理的承诺拒绝警告
Unhandled Promise Rejection Warning inside async.js waterfall
我正在使用令人惊叹的 async.js 库进行一个项目。试图理解 promises 的用法,但我做不到。
我实现了以下代码:
function connect(){
return new Promise(function (resolve, reject) {
bar.getConnection( server, function( err, conn ){
if( err ) {
reject("An error. " + err);
}
else{
resolve("Ok. Connected to: " + conn.serverAddress);
}
});
});
}
然后在 async waterfall
:
exports.getRequest = function( callbk ){
(function(callback) {
async.waterfall([
function (next) {
connect().then(function (result) {
console.log(result);
next();
}).catch(function (e) {
// If something gets an error on the next function, this catch fires
// And the 'next(e)' does not execute
console.log("An error here");
next(e);
});
},
function (next) {
// do something .... and get a result
// but if something gets an error here, fires the 'catch' on 'connect'
next(null, result);
},
function (err, result) {
if(err) {
callback(true, "" + err);
}
else {
callback(false, result);
}
}
]);
})(function(error, result) {
callbk(error, result);
});
}
但是,如果 'waterfall' 中的第二个函数出现问题,第一个函数的 catch
就会出现,并附带:
(node:8984) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Callback was already called.
(node:8984) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
我知道将 Promises 与 async.js 一起使用不是一个好主意,但我想了解原因。
关于同样的问题,我看到的答案很少,但我仍然无法解决。
I know it's not a good idea to use Promises with async.js
好!
but I want to understand why.
如果您的回调之一(包括传递给 getRequest
的回调)中的 anything 确实从 next();
中的 next();
调用中抛出异常13=]回调,承诺将拒绝。不仅如此,被拒绝的承诺上的 catch
也会执行,现在调用 next(e);
- 这将使 async.js 抱怨 next
回调被调用两次,忽略 e
并用新的异常拒绝第二个承诺。此拒绝不会在任何地方处理,并且会记录到您的控制台。
看看 difference between .then(…, …)
and .then(…).catch(…)
- 如果你使用前者,那么原始异常将拒绝承诺并被记录为未处理,没有回调被调用两次:
connect().then(function (result) {
console.log(result);
next(null, e);
}, function (e) {
console.log("An error here");
next(e);
});
我正在使用令人惊叹的 async.js 库进行一个项目。试图理解 promises 的用法,但我做不到。
我实现了以下代码:
function connect(){
return new Promise(function (resolve, reject) {
bar.getConnection( server, function( err, conn ){
if( err ) {
reject("An error. " + err);
}
else{
resolve("Ok. Connected to: " + conn.serverAddress);
}
});
});
}
然后在 async waterfall
:
exports.getRequest = function( callbk ){
(function(callback) {
async.waterfall([
function (next) {
connect().then(function (result) {
console.log(result);
next();
}).catch(function (e) {
// If something gets an error on the next function, this catch fires
// And the 'next(e)' does not execute
console.log("An error here");
next(e);
});
},
function (next) {
// do something .... and get a result
// but if something gets an error here, fires the 'catch' on 'connect'
next(null, result);
},
function (err, result) {
if(err) {
callback(true, "" + err);
}
else {
callback(false, result);
}
}
]);
})(function(error, result) {
callbk(error, result);
});
}
但是,如果 'waterfall' 中的第二个函数出现问题,第一个函数的 catch
就会出现,并附带:
(node:8984) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Callback was already called.
(node:8984) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
我知道将 Promises 与 async.js 一起使用不是一个好主意,但我想了解原因。
关于同样的问题,我看到的答案很少,但我仍然无法解决。
I know it's not a good idea to use Promises with async.js
好!
but I want to understand why.
如果您的回调之一(包括传递给 getRequest
的回调)中的 anything 确实从 next();
中的 next();
调用中抛出异常13=]回调,承诺将拒绝。不仅如此,被拒绝的承诺上的 catch
也会执行,现在调用 next(e);
- 这将使 async.js 抱怨 next
回调被调用两次,忽略 e
并用新的异常拒绝第二个承诺。此拒绝不会在任何地方处理,并且会记录到您的控制台。
看看 difference between .then(…, …)
and .then(…).catch(…)
- 如果你使用前者,那么原始异常将拒绝承诺并被记录为未处理,没有回调被调用两次:
connect().then(function (result) {
console.log(result);
next(null, e);
}, function (e) {
console.log("An error here");
next(e);
});