2016-07-08 14 views
6

Obecnie próbuję wprowadzić w życie moją własną obietnicę do użycia wewnątrz Angular 2. Jeśli I reject obietnicy, dostanę Error: Uncaught (in promise): nope(…), ale tylko na pierwszej obietnicy do odrzucenia .Nieobowiązkowe odrzucenie obietnicy odrzucenia obietnicy w Angular 2

To jest Angular 2.0.0-rc.4, ale zauważyłem to w innych zachowaniach. Moje pytanie brzmi: czy jest to błąd w moim rozumieniu obietnic, czy też jest to błąd, który należy zgłosić projektowi Angular?

Przykładowy kod:

import {Component} from '@angular/core'; 
import {bootstrap} from '@angular/platform-browser-dynamic' 
@Component({ 
    template: "TestComponent" 
}) 
class TestComponent { 
} 
bootstrap(TestComponent, []); 

let p = new Promise((resolve, reject) => { 
    console.log("create promise"); 
    reject("nope"); 
}); 
console.log("setting up"); 
p.then(r => console.log("then: " + r)); 
p.catch(e => console.log("reject: " + e)); 
console.log("setup done"); 

Console (Google Chrome 51.0.2704.106, Linux 64 bit):

create promise 
setting up 
setup done 
reject: nope 
Angular 2 is running in the development mode. Call enableProdMode() to enable the production mode. 
Unhandled Promise rejection: nope ; Zone: <root> ; Task: Promise.then ; Value: nope 
Error: Uncaught (in promise): nope(…) 
+1

Czy używasz obietnicy es6 lub masz własną implementację? – Kliment

+0

Implementacja to 'ZoneAwarePromise' z' zone.js', o ile wiem. Dlatego myślę, że jest to związane z Angular. –

+0

Tytuł jest w pewien sposób mylący. "wdrożenie własnej obietnicy w Angular 2" jednoznacznie sugeruje, że istnieje implementacja obietnicy homebrew. – estus

Odpowiedz

9

Powinno być

p 
.then(r => console.log("then: " + r)) 
.catch(e => console.log("reject: " + e)); 

p.then(...) sam tworzy nieobsługiwany łańcuch, to przeszkadza Zone.js. Jeśli masz do czynienia z "nieobsłużonymi odrzuceniami" Bluebird, być może znasz już zasady.

+0

Dzięki, właśnie to odkryłem, kiedy" kliknęło "w moim mózgu, kiedy myślałem o tym, dlaczego rozwiązanie z Thierry Templier pracował. –

3

Można było następujące:

let p = new Promise((resolve, reject) => { 
    console.log("create promise"); 
    reject("nope"); 
}); 
console.log("setting up"); 
p.then(r => console.log("then: " + r), // <----- 
    e => console.log("reject: " + e)); 
+1

Właściwie to działa, dziękuję, nigdy nie myślałem o tym. Ale dlaczego nie jest właściwe używanie wywołania zwrotnego '.catch'? –

+1

To dlatego, że 'catch' jest handlarzem obiecującym (wtedy lub złapanym) i nie przestawają się łańcuchować ... –

Powiązane problemy