长话短说:我不确定应该从fromPromise()。catch()方法中捕获哪种错误,以及在onError(错误:错误)观察者方法中应该解决哪些错误。
我将node.js与rxjs一起使用,这就是我将我的承诺转换为可观察数据的原因。
看一下经典的Promise定义
const getPromise = (target) => {
return new Promise((resolve, reject) => {
request(
{
url: url,
json: true
},
(error, response, body) => {
if (error) {
reject({
id: id,
error: error,
response: response,
body: body
});
} else {
resolve({
id: id,
body: body
});
}
}
);
});
};
我在循环中转换我的承诺并返回可观察数组
const observableItems = [];
targetList.forEach((target) => {
const observableItem = {
id: target.id,
observable$: rx.Observable
.fromPromise(getPromise(target))
.catch((error) => {
// [1]
return rx.Observable.of(error);
})
};
observableItems.push(observableItem);
});
return observableItems;
然后我订阅了我的observables
observableItems.forEach((observableItem) => {
const currentSubscribtion = observableItem.observable$.subscribe(
(payload) => {
if (payload && payload.error) {
handleInvalidPayload(payload);
} else {
handleValidPayload(payload);
}
},
(error) => {
// [2]
}
);
subscribtions.push(currentSubscribtion);
});
我的问题:
1 /是否可以从[1]中抛出错误并将其直接传递给[2]点?这时我在onNext()中得到if语句 - 我不喜欢它。
我尝试在catch()方法中使用return Observable.throw(someObject)而没有任何成功。
2 /应该在catch()和OnError()方法中解决哪种错误?
我用404这样的代码询问连接超时,ENOTFOUND和后端错误?
答案 0 :(得分:1)
catch
运算符的目的是处理上游错误并将所需的值替换为observer::next
(或者在需要时重新抛出)。
适用于
等案件是否可以从[1]中抛出错误并将其直接传递给[2]点?
,您似乎想直接处理错误观察器中的错误。这意味着您不需要catch
它,拒绝抛出错误观察者。考虑简单的代码片段立即拒绝
const p = new Promise((res, rej) => rej(0));
Rx.Observable.fromPromise(p)
.subscribe((x) => {}, (e) => console.log(e)); //0
下一个观察者将不会被召唤。
如上所述,catch
运算符提供了根据需要替换错误的机制。说你被拒绝的值是你想要内部处理并向前传递的东西,然后你可以将一些值返回给观察者。这取决于你想要处理的错误的性质,如果你想终止具有错误条件的可观察流,你可能不需要捕获它。