почему .catch выполняется до того, как исполнитель выполнит свою задачу? - PullRequest
0 голосов
/ 16 декабря 2018

после запуска приведенного ниже кода я упомянул вывод, полученный в консоли.Насколько я понимаю, как только обещание определено, executor завершает свою задачу, .then и .catch выполняется только тогда.Но результаты ниже указывают, что .catch выполняется перед запуском executor.Может кто-нибудь, пожалуйста, помогите?

код:

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 {domain: null,

1 Ответ

0 голосов
/ 16 декабря 2018

.catch принимает функцию в качестве параметра.Когда вы делаете

.catch(
    console.log('exception handling')
);

, интерпретатор немедленно вызывает там console.log в попытке вывести из него функцию, чтобы функцию можно было поместить в цепочку Promise, так что он может быть вызван, если есть ошибка, которая должна быть перехвачена.Чтобы поведение было более ожидаемым, измените его на:

.catch(() => {
  console.log('exception handling')
});

Но другая проблема заключается в том, что все ошибки будут в настоящее время "перехвачены" выше, в вашей ошибке .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')
); 

Лучше всего иметь только одно .catch местоположение, например:

dbconnect
  .then(
    db => {
      console.log('db value :', db);
    }
  )
  .catch(
    (err) => console.log('exception handling')
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...