Отклонение обещания с другим новым обещанием - PullRequest
1 голос
/ 03 апреля 2020

Я играю с обещаниями, и мне нужен был способ отклонить обещание внутри тогдашнего обратного вызова. Так что это делается с помощью вызова throw return или return Promise.reject () ;. Все идет нормально. Вы можете выполнить sh это, также вызвав new Promise.reject (); без возврата

Может кто-нибудь объяснить, почему это работает?

new Promise((res, rej) => {
  setTimeout(() => {
    res(200);
  }, 2000);
})
  .then(() => {
    console.log("ok1");
    new Promise.reject();
    // return Promise.reject(); 
  .then(() => {
    console.log("ok2");
  })
  .catch(() => {
    console.log("error");
  });

Ответы [ 4 ]

1 голос
/ 03 апреля 2020

Это из-за внутренней работы Promise.reject. В основном это так:

Promise.reject = function(err) {
  return new this((_, rej) => rej(err));
};

Теперь, если вы вызываете его с помощью new, this относится к вновь созданному объекту, и это не конструктор.

 Promise.reject(); // this == Promise -> constructor
 new Promise.reject(); // this == {} -> not a constructor

Следовательно, обратный вызов .then выдает ошибку, и это приводит к отклонению возвращенного обещания с этой ошибкой.

1 голос
/ 03 апреля 2020

new Promise.reject()

Ваш код вызывает исключение. Исключения приводят к тому, что обещания будут отклонены.

1 голос
/ 03 апреля 2020

Новый Promise.reject выдает ошибку, поэтому код переходит к разделу catch со следующей ошибкой: Promise.reject is not a constructor

new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('OK');
  }, 2000);
}).then((res) => {
    console.log(res);
    new Promise.reject(); 
    })
  .then((res) => {
    console.log(res);
  })
  .catch((err) => {
    console.log('error' ,err.message);
  });
1 голос
/ 03 апреля 2020

Поскольку Promise.reject не является конструктором, этот код работает нормально:

new Promise((res, rej) => {
  setTimeout(() => {
    res(200);
  }, 2000);
})
  .then(() => {
    console.log('ok1')
    Promise.reject('error!')
})
  .then(() => {
    console.log("ok2");
  })
  .catch(() => {
    console.log("error");
  });
...