【问题标题】:How to reject promise and handle/catch error in Angular2如何在Angular2中拒绝承诺并处理/捕获错误
【发布时间】:2018-02-23 23:24:18
【问题描述】:

我正在学习 Angular2,并希望对服务中的方法进行正确的错误处理。

出于测试目的,我更改了 API,因此我得到了一个无效的测试结果。我想拒绝 Promise ("Received unexcepted data.") 并将错误消息存储在我的角度组件中。

我的服务方式:

getBlocks(): Promise<Block[]> {
    return this.http.get(this.serviceUrl)
        .toPromise()
        .then(response => {
            if (response.json() instanceof Array) {
                return response.json() as Block[];
            } else {
                Promise.reject('Received unexpected data.');
            }
        })
        .catch(this.handleError);
}

private handleError(error: any): Promise<any> {
    console.log('An error occurred in MyService', error);
    return Promise.reject(error.message || error);
}

我调用服务的组件:

getBlocks(): void {
    this.myService.getBlocks().then(blocks => {
        this.blocks = blocks;
    }, error => {
        console.log('fail callback');
        this.error = error;
    }).catch(e => {
        console.log('catch');
        this.error = e;
    });
}

我尝试实现 promise 的失败回调,但我的应用不断崩溃

错误错误:未捕获(承诺):收到意外数据。

所以有我的错误消息,但它没有在我的组件中得到正确处理。如何正确地从服务中捕获我的 Promise.reject(),以便我可以将错误存储在 this.error 变量中。

补充问题: 我已经实现了 then() 调用的成功和失败回调。之后的 catch() 是否必要?还是应该只在没有失败回调的情况下完成?还是这两种情况没有可比性?

【问题讨论】:

    标签: angular typescript error-handling promise


    【解决方案1】:

    只需更改代码以返回 Promise.Reject

    getBlocks(): Promise<Block[] | void> {
        return this.http.get(this.serviceUrl)
            .toPromise()
            .then(response => {
                if (response.json() instanceof Array) {
                    return response.json() as Block[];
                } else {
                    return Promise.reject('Received unexpected data.'); // HERE
                }
            })
            .catch(this.handleError);
    }
    

    我得到了以下结果:

    MyService 发生错误收到意外数据。

    失败回调

    【讨论】:

    • with return Promise.reject('..'); 我收到一个编译错误Argument of type '(response: Response) =&gt; Block[] | Promise&lt;never&gt;' is not assignable to parameter of type '(value: Response) =&gt; PromiseLike&lt;never&gt;'. Type 'Block[] | Promise&lt;never&gt;' is not assignable to type 'PromiseLike&lt;never&gt;'.
    • @JackO'neill,尝试将方法签名更改为getBlocks(): Promise&lt;Block[] | void&gt;
    【解决方案2】:

    如果你想在你的 catch 子句中捕获错误,你只需要:

    throw new Exception("received unexpected...");
    

    而不是拒绝承诺。

    Promise.reject() 有处理拒绝的文档。如果这是你想要的,你应该返回 Promise.reject 以便任何期待承诺的东西都能抓住它。

    【讨论】:

    • 但是 promise.reject 的目的是什么?不应该在那种情况下使用吗?
    • @JackO'neill 拒绝承诺不会在您的处理程序中捕获它。这是解决的文档。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    • 您可以添加 then() 并在此处处理它,或者将 Promise.reject() 传回,因为它是一个承诺。
    猜你喜欢
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多