Урок тук. Ако свържете своите .then()
и .catch()
манипулатори директно към обещанието (без да създавате междинна p
променлива и междинни вериги на обещания) и имате .catch()
манипулатор в края на всяка верига, е много малко вероятно (може би напълно малко вероятно) да получите " необработено съобщение за отхвърляне на обещание.
Въз основа на други случаи на това, които съм виждал както в собствения си код, така и тук при препълване на стека, струва ми се, че интерпретаторът или библиотеката с обещания донякъде отгатва, когато възникне необработена ситуация на отхвърляне и не е перфектен в отгатването си.
Във вашия случай интерпретаторът видя, че p.then()
няма .catch()
манипулатор и след това видя p
да бъде отхвърлен. Така че тази обещаваща верига всъщност няма манипулатор .catch()
. Така че тази верига от обещания ще завърши с отхвърляне и няма манипулатор. Това задейства предупреждението.
Не беше достатъчно умен да види, че има отделно p.catch()
или не смяташе, че е оправдано да не показва предупреждението.
Както вече разбрахте, това винаги ще бъде безопасно:
new Promise(function(resolve){
throw "failure";
}).then(function(data) {
console.log(data);
}).catch(function(err){
console.log(err);
});
защото няма обещаващи вериги, които някога могат да получат отказ, който не е уловен от .catch()
. Помислете два пъти дали изобщо да запазите обещание към променлива - просто направете една верига обещания (или разклонени вериги вътре в .then()
манипулатори, ако е необходимо). Почти никога не съм намирал за необходимо да запиша обещание в променлива, освен понякога, когато го връщам от функция и изпълнявам някакъв код във функцията, след като обещанието е създадено. Обикновено можете просто да направите:
f().then(...).then(...).catch(...);
person
jfriend00
schedule
13.03.2018
p.then(…)
, което се отхвърля без манипулатор - person Bergi   schedule 13.03.2018