角度服务中的一个方法返回一个组件订阅的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是异步调用。有人可以建议如何重新安排代码以捕获服务返回的错误。
谢谢, 阿什利
答案 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()
错误。因此,你必须在那里管理。
注意:我只解决了上述问题。我不确定我不知道的部分 -
if(data === "14")
- 在这里,您似乎想要将其与数字14进行比较而不是字符串“14”。 this.nativeService.set(data)
- 假设此承诺正确返回所有内容。