2016-07-08 3 views
6

В настоящее время я пытаюсь реализовать свое собственное обещание, которое будет использоваться внутри Angular 2. Если я reject обещаю, я получу Error: Uncaught (in promise): nope(…), но только на первом обещании, которое будет отклонено ,Unhandled Promise rejection при отказе Обещание в Angular 2

Это Angular 2.0.0-rc.4, но я заметил это в других формах поведения. Мой вопрос в том, является ли это ошибкой в ​​моем понимании обещаний, или это ошибка, о которой следует сообщать в проект Angular?

Пример кода:

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"); 

консоли (Google Chrome 51.0.2704.106, Linux 64 бит):

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

Вы используете обещание es6 или у вас есть своя реализация? – Kliment

+0

Реализация является 'ZoneAwarePromise' из' zone.js', насколько я могу судить. Вот почему я думаю, что это связано с Угловым. –

+0

Название как-то вводит в заблуждение. «Внедрение собственной« Обещания в угловом 2 »однозначно свидетельствует о том, что существует реализация обещания« доморощенного ». – estus

ответ

9

Это должно быть

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

p.then(...) только создает необработанную цепь, это беспокоит Zone.js. Если вы имеете дело с «необработанными отказами» Блюберда, вы, возможно, уже знаете правила.

+0

Спасибо, я просто обнаружил это, когда он сделал« щелчок »в моем мозгу, когда я думал о том, почему решение от Тьерри Templier работал. –

3

Вы можете следующим образом:

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

На самом деле, это работает, спасибо, я никогда об этом не думал. Но почему неправильно использовать обратный вызов '.catch'? –

+1

Это потому, что 'catch' является обработчиком обещаний (тогда или поймать), и они не прекращают цепочку ... –

Смежные вопросы