运行以下代码后,我提到了在控制台中获得的输出。 根据我的理解,一旦定义了promise,执行程序就完成其任务,然后.catch和.catch才执行。但是下面的结果表明.catch在执行程序运行之前被执行。谁能帮忙吗?
代码:
var dbconnect = new Promise(function(resolve, reject){
mongoClient.connect(db, { useNewUrlParser: true }, (error, db) => {
if (error) {
console.log('Database connection failed')
reject(Error('Database Connection Failed'))
} else {
console.log('Database connected')
resolve(db)
}
})
});
dbconnect
.then(
db => {
console.log('db value :', db);
},
error => {
console.log('connection failed :', error)
}
)
.catch(
console.log('exception handling')
);
输出: 异常处理
数据库已连接
db值:MongoClient { 域:空
答案 0 :(得分:5)
.catch
接受 function 作为参数。当你做
.catch(
console.log('exception handling')
);
解释器立即在那里调用console.log
,以尝试从中获取功能,以便将该功能放入Promise
链中,以便将其放入如果需要捕获错误,可以调用。为了使行为更符合预期,请更改为:
.catch(() => {
console.log('exception handling')
});
但是另一个问题是,目前所有{em>所有错误都将被捕获在.then
的错误处理程序中(第二个函数传递给.then
): / p>
const mongoClient = { connect: (_, __, fn) => {
setTimeout(() => {
fn('some error');
}, 500);
}};
var dbconnect = new Promise(function(resolve, reject){
mongoClient.connect('db', { useNewUrlParser: true }, (error, db) => {
if (error) {
console.log('Database connection failed')
reject(Error('Database Connection Failed'))
} else {
console.log('Database connected')
resolve(db)
}
})
});
dbconnect
.then(
db => {
console.log('db value :', db);
},
error => {
console.log('connection failed :', error)
}
)
.catch(
() => console.log('exception handling')
);
最好只有一个 .catch
位,例如:
dbconnect
.then(
db => {
console.log('db value :', db);
}
)
.catch(
(err) => console.log('exception handling')
);