Używam Oboe.js do analizowania naprawdę bardzo duży plik JSONUnhandled odrzucenie obietnica w asynchronicznych obietnic
const promises = [];
oboe('http://domain/my-file.js')
.node('items.*', item => {
// parseItem() returns a rejected Promise because of invalid JSON items
promises.push(parseItem(item));
})
.done(() => {
Promise.all(promises).then(() => {
doSomething();
});
})
Ale moja konsola Przeglądarka zostanie zalany Uncaught (in promise)
. To samo dzieje się, jeśli piszesz obietnicę w setTimeout()
jak
const promises = [];
setTimeout(() => {
promises.push(Promise.reject());
}, 500);
// some time in the future
Promise.all(promises);
Co naprawdę dziwne: Nowoczesne przeglądarki zachowują się inaczej. W Firefox Developer Edition wszystko działa bez komunikatów o błędach, a w Chrome jestem zalewany Uncaught (in promise)
. W Chrome natychmiast otrzymasz wiadomość, jeśli napiszesz bez żadnego haczyka Promise.reject();
. W Firefoksie i Safari nic się nie dzieje.
Jakie jest rozwiązanie tego problemu? Ignorujesz wiadomość? Mam na myśli, jeśli to zachowanie jest naprawdę w oficjalnej specyfikacji obietnicy, to obietnice w asynchronicznym kodzie nie mają dla mnie większego sensu.
Obecnie istnieją dwa obozy ludzi pod względem obietnic es6. Jeden obóz (włączając w to programistów Chrome) rozważ, w jaki sposób używasz obietnic, aby być niewłaściwym użytkiem. Zachowanie, którego doświadczasz, nie jest zgodne z obietnicą obietnic, mimo że jest kilka propozycji, ponieważ drugi obóz ponownie naciska, że przypadki użycia, takie jak twoje, są istotne. Niestety, niektóre przeglądarki dodały nieobsługiwane obietnice odrzucania zgłoszeń pomimo braku specyfikacji i pomimo tego, że cofają się przeciwko niemu. –
@MicahZoltu uczciwie, obozy są podzielone nawet między chromowanymi programistami. –
@MicahZoltu dziękuję za wyjaśnienia. W tej chwili bardzo mylące jest to, która implementacja będzie właściwa. – LongFlick