为什么.catch在执行者完成其任务之前得到执行?

时间:2018-12-16 07:24:43

标签: node.js promise

运行以下代码后,我提到了在控制台中获得的输出。 根据我的理解,一旦定义了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 {   域:空

1 个答案:

答案 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')
  );