Bawię się obietnicami i szukałem sposobu na odrzucenie obietnicy w ramach oddzwonienia. Robi się to przez wywołanie funkcji throw return lub return Promise.reject () ;. Na razie w porządku. Możesz to osiągnąć, wywołując również new Promise.reject (); bez powrotu.

Czy ktoś może wyjaśnić, dlaczego to działa?

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");
  });
1
George Paouris 3 kwiecień 2020, 13:44

4 odpowiedzi

Najlepsza odpowiedź
new Promise.reject()

Twój kod zgłasza wyjątek. Wyjątki powodują odrzucenie obietnic.

2
Quentin 3 kwiecień 2020, 10:50

Dzieje się tak z powodu wewnętrznego działania Promise.reject. Zasadniczo:

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

Teraz, jeśli wywołasz to za pomocą new, this odnosi się do nowo utworzonego obiektu, a to nie jest konstruktor.

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

Dlatego wywołanie zwrotne .then zgłasza błąd, który powoduje odrzucenie zwróconej Obietnicy z tym błędem.

1
Jonas Wilms 3 kwiecień 2020, 10:58

New Promise.reject zgłasza błąd, więc kod przeskakuje do sekcji catch z następującym błędem: 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
Melchia 3 kwiecień 2020, 10:58

Ponieważ Promise.reject nie jest konstruktorem, ten kod działa dobrze:

new Promise((res, rej) => {
  setTimeout(() => {
    res(200);
  }, 2000);
})
  .then(() => {
    console.log('ok1')
    Promise.reject('error!')
})
  .then(() => {
    console.log("ok2");
  })
  .catch(() => {
    console.log("error");
  });
1
Mark Minerov 3 kwiecień 2020, 10:50