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

时间:2017-04-20 12:44:54

标签: angular typescript ionic-framework ionic2

角度服务中的一个方法返回一个组件订阅的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 个答案:

答案 0 :(得分: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()错误。因此,你必须在那里管理。

注意:我只解决了上述问题。我不确定我不知道的部分 -

  1. if(data === "14") - 在这里,您似乎想要将其与数字14进行比较而不是字符串“14”。
  2. http.get()的结果是什么?如果它返回一个数字值,那就没关系。
  3. this.nativeService.set(data) - 假设此承诺正确返回所有内容。