当我使用Angular HttpClient发出GET请求时,我得到一个可观察的返回,并在RxJS操作符mergeMap中处理它。
现在一次又一次地抛出404,我想抓住它。最后,浏览器控制台中不应出现错误消息,并且应使用流的下一个值处理管道。
这有可能吗?我没有用catchError()管理它。
以下是我的代码的简化版本:
...
this.service1.getSomeStuff().pipe(
mergeMap((someStuff) => {
return from(stuff);
}),
mergeMap((stuff) => {
return this.service2.getMoreStuff(stuff.id); // Here I need some error handling, if 404 occurs
}),
mergeMap((things) => {
return from(things).pipe(
mergeMap((thing) => {
if (allLocations.some(x => x.id === metaData.id)) {
return this.service2.getMore(thing.id, thing.type, thing.img_ref);
}
}),
map((thing) => {
...
更新:添加了带有catchError()的方法
我尝试过这种方式,但没有检测到错误,下一个mergeMap也不起作用(IDE不再识别thing.id、thing.type、thing.img\u ref等参数):
...
this.service1.getSomeStuff().pipe(
mergeMap((someStuff) => {
return from(stuff);
}),
mergeMap((stuff) => {
return this.service2.getMoreStuff(stuff.id).pipe(
catchError(val => of(`Error`))
);
}),
mergeMap((things) => {
return from(things).pipe(
mergeMap((thing) => {
if (allLocations.some(x => x.id === metaData.id)) {
return this.service2.getMore(thing.id, thing.type, thing.img_ref);
}
}),
map((thing) => {
...
您需要使用retry
或retryWhen
(名称不言自明)-这些操作员将重试失败的订阅(一旦发出错误,重新订阅源可观测)。
要在每次重试时提升id
,可以将其锁定在一个范围内,如下所示:
const { throwError, of, timer } = rxjs;
const { tap, retry, switchMap } = rxjs.operators;
console.log('starting...');
getDetails(0)
.subscribe(console.log);
function getDetails(id){
// retries will restart here
return of('').pipe(
switchMap(() => mockHttpGet(id).pipe(
// upon error occurence -- raise the id
tap({ error(err){
id++;
console.log(err);
}})
)),
retry(5) // just limiting the number of retries
// you could go limitless with `retry()`
)
}
function mockHttpGet(id){
return timer(500).pipe(
switchMap(()=>
id >= 3
? of('success: ' + id)
: throwError('failed for ' + id)
)
);
}
<script src="https://unpkg.com/rxjs@6.4.0/bundles/rxjs.umd.min.js"></script>
问题内容: 应该返回什么?根据我的计算,应该是,但是解释器会返回。 这是Python的事情,还是我的数学很糟糕? 问题答案: 根据docs,其优先级高于,因此您的代码等同于。为了获得理想的结果,您可以将其放在括号中 或使用内置功能 或功能(返回值)
我在条件运算符的true子句中得到了未定义属性的意外行为: 示例:Javascript: 不停摆弄 预期的行为是获取一个日志条目,上面写着"未定义,而是抛出了一个错误:。怎么会这样,对象被选中,它永远不会执行htis coe路径。一个工作示例是: 不停摆弄
问题内容: 您认为在PHP中使用@运算符来抑制错误/警告是否有效,而您可能正在处理该错误? 如果是这样,您将在什么情况下使用它? 欢迎使用代码示例。 编辑:注释给回复者。我不想关闭错误报告功能,但是,例如,通常的做法是使用 然后再检查…但是您可以通过执行以下操作来消除@ 或类似。 我想问题是-是否有@HAS可以用来阻止错误,并且不能以任何其他方式处理? 问题答案: 我将抑制该错误 并进行处理 。否
本文向大家介绍PHP错误控制运算符,包括了PHP错误控制运算符的使用技巧和注意事项,需要的朋友参考一下 介绍 在PHP中,将@符号定义为错误控制运算符。当它以任何表达式为前缀时,PHP解析器在执行时遇到的任何错误都将被抑制,并且该表达式将被忽略。 以下代码尝试打开一个不存在的文件进行读取操作,但是PHP解析器报告警告 示例 输出结果 将显示以下结果 在fopen()表达式前添加@符号可抑制错误消息
主要内容:算术运算符,关系运算符,逻辑运算符,赋值运算符,按位运算符运算符是一个符号,它告诉编译器执行特定的数学或逻辑操作。 在批处理脚本中,以下类型的操作符是可以执行的。 算术运算符 关系运算符 逻辑运算符 赋值运算符 按位运算符 算术运算符 批处理脚本语言支持任何语言的普通算术运算符。 以下是可用的算术运算符。 算术运算符示例 运算符 描述 示例 两个操作数相加 的结果为: 从第一个减去第二个操作数 的结果为: 两个操作数的乘法 的结果为: 分母除以分子 的结
本文向大家介绍如何处理R中的错误“ $运算符对于原子向量无效”?,包括了如何处理R中的错误“ $运算符对于原子向量无效”?的使用技巧和注意事项,需要的朋友参考一下 发生此错误的原因是$运算符不是设计用来访问向量元素的。如果我们使用$运算符来访问向量元素,则R无法理解它并认为它是无效的,因此,对于使用$运算符的位置,我们必须非常小心。当我们给元素命名并开始考虑将它们视为数据框列时,就会发生这种情况,