2016-07-08 23 views
6

Attualmente sto cercando di implementare la mia Promessa da utilizzare all'interno di Angular 2. Se I reject la promessa, otterrò un Error: Uncaught (in promise): nope(…), ma solo sulla prima Promessa da respingere .Rifiuto di Promessa non gestita quando si rifiuta Promessa in Angolare 2

È Angular 2.0.0-rc.4, ma ho notato questo in altri comportamenti. La mia domanda è, questo è un errore nella mia comprensione delle Promesse, o è un bug che dovrebbe essere segnalato al progetto Angular?

codice di esempio:

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 a 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

stai usando la prom es6 o hai la tua implementazione? – Kliment

+0

L'implementazione è 'ZoneAwarePromise' da' zone.js', per quanto posso dire. Questo è il motivo per cui penso sia correlato ad Angular. –

+0

Il titolo è in qualche modo fuorviante. "Implementare la propria promessa in Angular 2" suggerisce inequivocabilmente che esiste un'implementazione di Promise homebrew. – estus

risposta

9

Dovrebbe essere

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

p.then(...) da solo crea una catena non gestita, questo disturba Zone.js. Se hai affrontato i "rigetti non gestiti" di Bluebird, potresti già conoscere le regole.

+0

Grazie, l'ho appena scoperto quando ha fatto "clic" nel mio cervello mentre stavo pensando al motivo per cui la soluzione da Thierry Templier ha funzionato. –

3

Si potrebbe il seguente:

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

In realtà, funziona, grazie, non ci avevo mai pensato. Ma perché è sbagliato usare il callback '.catch'? –

+1

È perché "catch" è un gestore di promesse (quindi o cattura) e non smettono di concatenare ... –

Problemi correlati