【问题标题】:catching a promise error wrapped into an observable - angular 2捕获包装到可观察对象中的承诺错误 - 角度 2
【发布时间】:2017-09-17 02:41:11
【问题描述】:

角度服务中的一个方法返回一个组件订阅的 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 是一个异步调用。有人可以建议如何重新安排代码以捕获服务返回的错误。

谢谢, 阿什利

【问题讨论】:

  • set(value) 还是set(data)
  • @suraj 是设置数据。

标签: angular typescript ionic-framework ionic2


【解决方案1】:

这不是从 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. Promise 错误(.subscribe 的数据中的 1 和 2)和 3.http.get() 错误。因此,您必须在那里进行管理。

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

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

【讨论】:

  • 谢谢。让我试试看。
  • 谢谢,你的代码给了我解决我的特殊问题的起点:-)
猜你喜欢
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2018-02-11
  • 2016-09-12
相关资源
最近更新 更多