运行下面的代码后,我已经提到了我在控制台中得到的输出.根据我的理解,一旦定义了promise,执行者就完成了它的任务,然后只有.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')
);
Run Code Online (Sandbox Code Playgroud)
输出:异常处理
数据库连接
db值:MongoClient {domain:null,
.catch接受函数作为参数.当你这样做
.catch(
console.log('exception handling')
);
Run Code Online (Sandbox Code Playgroud)
解释器立即调用console.log它来尝试从中获取一个函数,以便可以将函数放入Promise链中,以便在需要捕获的错误时调用它.为了使行为更符合预期,请更改为:
.catch(() => {
console.log('exception handling')
});
Run Code Online (Sandbox Code Playgroud)
但另一个问题是,在你的错误处理程序(传递给第二个函数)中,所有错误都将被"捕获"到上面:.then.then
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')
); Run Code Online (Sandbox Code Playgroud)
最好只有一个单一的 .catch位置,例如:
dbconnect
.then(
db => {
console.log('db value :', db);
}
)
.catch(
(err) => console.log('exception handling')
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23 次 |
| 最近记录: |