为什么.catch在执行者完成任务之前就被执行了?

Moh*_*wal 0 node.js promise

运行下面的代码后,我已经提到了我在控制台中得到的输出.根据我的理解,一旦定义了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,

Cer*_*nce 5

.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)