首页 文章

将一个承诺错误包含在一个可观察的角度 - 角度2

提问于
浏览
2

角度服务中的一个方法返回一个组件订阅的Observable . 但是在那种方法中,还有一个承诺也会被返回,我希望能够在它返回拒绝的情况下捕获它 . 找到下面的代码:

return this.http.get(url)
            .map(res => res.json())
            .map((data: any) => {
                try {
                    if (data === "14") {
                        this.nativeService.set(value)
                            .then(() => {
                                console.log('ok');
                            })
                            .catch((err) => { throw new Error(); //error that I want to catch
                            })
                    }
                }
                catch (err) {
                    throw new Error();
                }
                return data;
            })
            .catch((err) => this.handleError(err));

此nativeService目前已被模拟,返回以下内容

set(value: any): Promise<any> {
    return new Promise((resolve, reject) => {
        reject('');
    })
}

但是会返回数据 . 然后抛出错误,我无法捕获它以调用方法handleError() . 我知道promise是异步调用 . 有人可以建议如何重新安排代码,以捕获服务返回的错误 .

谢谢,阿什利

1 回答

  • 2

    这不是您从observable返回数据的方式 . 你不能在这里使用简单的 return data 语句 . 此外,您已经返回了一个observable,那么您希望这些数据在哪里?

    对于要返回的数据,您实际上创建了一个新的observable并将观察者放在接收的数据上 .

    让我更正您的代码:

    return Observable.create((observer) => {
     this.http.get(url)
     .map(res => res.json())
     .subscribe((data) => {
       if (data === "14") {
         this.nativeService.set(data)
         .then(() => {
           console.log('ok');
           observer.next(data);
         })
         .catch((err) => {
           observer.next(err); // Error thrown if some problem in promise.
         })
       }
      },(err) => {
        observer.error(err); //Error thrown if problem in http.get().
      });
    

    现在您订阅的组件将有3个输出 . 1.数据2.承诺错误( .subscribe 数据中的1和2)和3. http.get() 错误 . 因此你必须在那里管理 .

    NOTE: 我只解决了上述问题 . 我不确定我不知道的那部分 -

    • if(data === "14") - 这里好像你要将它与数字14进行比较而不是字符串"14" .

    • http.get()结果是什么?如果它返回一个数字值,那就没关系 .

    • this.nativeService.set(data) - 假设此承诺正确返回所有内容 .

相关问题