Когда состояние Promise становится отклоненным или разрешенным - PullRequest
0 голосов
/ 14 ноября 2018

let promise = new Promise(function(resolve, reject) {
      setTimeout(() => reject(new Error("Whoops!")), 1000);
});

// reject runs the second function in .then
promise.then(
  result => alert(result), // doesn't run
  error => alert(error) // shows "Error: Whoops!" after 1 second
);

В приведенном выше фрагменте кода, хотя я вызываю отклонение, но состояние обещания приходит как решенное, но когда я удаляю error => alert(error) из promise.then, тогда я получаю обещаниесостояние как отклоненное Если кто-то вызывает отклонение, то состояние обещания должно быть отклонено, а не разрешено, я прав?

Ответы [ 4 ]

0 голосов
/ 14 ноября 2018

Обещание, которое разрешено, является не первоначальным обещанием, а обещанием, возвращенным then. Исходное обещание действительно отклонено, и вы можете проверить это по console.log(promise). Но поскольку вы прикованы цепью then , возвращается еще одно обещание ..

Возвращаемое значение [из then]

A Promise в состоянии в ожидании . Функция обработчика (onFulfilled или onRejected) затем асинхронно вызывается (как только так как стек пуст). После вызова функции-обработчика, если функция обработчика:

  • возвращает значение, обещание, возвращаемое then, разрешается с помощью возвращаемое значение в качестве значения;
  • ничего не возвращает, обещание, возвращаемое then, получает разрешено со значением undefined ;
  • выдает ошибку, обещание, возвращаемое потом, отклоняется с брошенным ошибка как ее значение;

...

Этот второй момент относится к вашему делу. Вы можете убедиться в этом, наблюдая, что Promise.reject().then(undefined, ()=>{})
возвращает обещание, которое разрешается со значением undefined.

0 голосов
/ 14 ноября 2018

Окончательный статус обещания также отклоняется в вашем случае. Попробуйте console.log (обещание); Это не имеет ничего общего с ошибкой => предупреждение (ошибка)

0 голосов
/ 14 ноября 2018

Код, который вы разместили, кажется, работает правильно как в Chrome, так и в Firefox - обещание было отклонено, как и ожидалось.Функция reject помечает Обещание как отклоненное - вы можете отреагировать на это отклонение, передав функцию обратного вызова во второй аргумент then или используя метод catch.Оба подхода верны.

Если вы столкнулись с каким-либо непредвиденным поведением, убедитесь, что вы не используете какой-либо неисправный полифилл, который заменяет оригинальный Promise объект.

Ссылка: Обещание.prototype.then , Promise.prototype.catch

0 голосов
/ 14 ноября 2018

Вы также можете обрабатывать Обещания так, как показано ниже

let promise = new Promise(function(resolve, reject) {
  setTimeout(() => reject('Error'));
});

promise
  .then(result => console.log('Result ', result)) 
  .catch(error => console.log('This is Error message -', error))
...