2017-02-25 52 views
10

Po wywołaniu oddzwonienia reject() pojawia się komunikat ostrzegawczy "Uncaught (in promise)" pojawia się w konsoli Chrome. Nie mogę owinąć głowy wokół przyczyny tego, ani tego, jak się go pozbyć.Promise reject() powoduje ostrzeżenie "Niepogoda (w obietnicy)"

var p = new Promise((resolve, reject) => { 
    setTimeout(() => { 
    var isItFulfilled = false 
    isItFulfilled ? resolve('!Resolved') : reject('!Rejected') 
    }, 1000) 
}) 

p.then(result => console.log(result)) 
p.catch(error => console.log(error)) 

Ostrzeżenie:

enter image description here

Edit:

I okazało się, że jeśli obsługi onRejected nie jest to wyraźnie przewidziane metody .then(onResolved, onRejected), JS automatycznie zapewni niejawny jednego . Wygląda to tak: (err) => throw err. Automatycznie wygenerowany handler rzuci z kolei.

referencyjny:

Jeśli IsCallable (onRejected) `jest fałszywy, następnie
      Niech onRejected być "Thrower".

http://www.ecma-international.org/ecma-262/6.0/index.html#sec-performpromisethen

Odpowiedz

8

Dzieje się tak dlatego, że nie przywiązują do obsługi catch obietnicy zwracany przez pierwszy then metody, która w związku z tym jest bez obsługi, gdy obietnica odrzuca. W ostatnim wierszu masz numer do w obietnicy p, ale nie dotyczy to przykutej obietnicy, zwróconej przez metodę then, w wierszu przed nią.

Poprawnie dodany w komentarzach poniżej, gdy nie jest dostarczona procedura obsługi catch (lub nie jest funkcją), to błąd ten jest wyświetlany na default one will throw. W obrębie łańcucha obietnic ten błąd może zostać przechwycony przez linię z wywołania zwrotnego metody catch, ale jeśli go nie ma, silnik JavaScript będzie obsługiwał ten błąd jak przy każdym innym nieprzechwyconym błędzie i zastosuje domyślną procedurę obsługi w takich okolicznościach, co skutkuje na wyjściu widzianym w konsoli.

Aby tego uniknąć, łańcuch metodę .catch obietnicy zwracany przez pierwszy then, tak:

p.then(result => console.log('Fulfilled')) 
.catch(error => console.log(error)); 
+0

Dziękuję trincot. Zrobiłem kilka dodatkowych badań i dowiedziałem się, że jeśli operacja onRejected nie zostanie jawnie przekazana, JS dostarczy niejawny: 'Jeśli IsCallable (onRejected)' to ** false **, to Niech 'onRejected' będzie" ** Thrower ** ". To wygląda mniej więcej tak: 'arg => throw arg' Pusty onRejected handler'() => {} 'może nadpisać to zachowanie. Ale 'null' nie będzie. _ref: http://www.ecma-international.org/ecma-262/6.0/index.html#sec-performpromisethen_ –

+0

Nie ma za co, i miłe odniesienie do specyfikacji EcmaScript! Dodałem to do mojej odpowiedzi na pytanie o kompletność. Wspaniały! – trincot

+0

@trincot Mam go powiązana i nadal daje mi niezatarty komunikat o błędzie –