Angular 角度反应形状值随管道而变化。这是虫子吗???
管道似乎不适用于被动表单控件值更改。我准备了这个,这样你就可以重现这个问题了 在文本字段中键入内容。然后键入“boom”(不带引号)。错误捕获后,控件不再工作。 之后,您可以验证是否在其上键入了新内容。它不检测任何其他输入 如果刷新页面,则它将再次工作Angular 角度反应形状值随管道而变化。这是虫子吗???,angular,rxjs,reactive-programming,angular-reactive-forms,reactive,Angular,Rxjs,Reactive Programming,Angular Reactive Forms,Reactive,管道似乎不适用于被动表单控件值更改。我准备了这个,这样你就可以重现这个问题了 在文本字段中键入内容。然后键入“boom”(不带引号)。错误捕获后,控件不再工作。 之后,您可以验证是否在其上键入了新内容。它不检测任何其他输入 如果刷新页面,则它将再次工作 我是不是遗漏了什么 是的,你肯定错过了什么 打开您的控制台(浏览器控制台,而不是blitz控制台),查看是否确实存在错误: Error: boom at SwitchMapSubscriber.eval [as project] (app
我是不是遗漏了什么 是的,你肯定错过了什么 打开您的控制台(浏览器控制台,而不是blitz控制台),查看是否确实存在错误:
Error: boom
at SwitchMapSubscriber.eval [as project] (app.component.ts:43)
at SwitchMapSubscriber._next (switchMap.ts:100)
at SwitchMapSubscriber.Subscriber.next (Subscriber.ts:102)
at SafeSubscriber.schedulerFn [as _next] (event_emitter.ts:88)
at SafeSubscriber.__tryOrUnsub (Subscriber.ts:270)
at SafeSubscriber.next (Subscriber.ts:212)
at Subscriber._next (Subscriber.ts:142)
at Subscriber.next (Subscriber.ts:102)
at EventEmitter.Subject.next (Subject.ts:62)
at EventEmitter.emit (event_emitter.ts:78)
这就是你的应用程序的问题所在 是的,你肯定错过了什么 打开您的控制台(浏览器控制台,而不是blitz控制台),查看是否确实存在错误:
Error: boom
at SwitchMapSubscriber.eval [as project] (app.component.ts:43)
at SwitchMapSubscriber._next (switchMap.ts:100)
at SwitchMapSubscriber.Subscriber.next (Subscriber.ts:102)
at SafeSubscriber.schedulerFn [as _next] (event_emitter.ts:88)
at SafeSubscriber.__tryOrUnsub (Subscriber.ts:270)
at SafeSubscriber.next (Subscriber.ts:212)
at Subscriber._next (Subscriber.ts:142)
at Subscriber.next (Subscriber.ts:102)
at EventEmitter.Subject.next (Subject.ts:62)
at EventEmitter.emit (event_emitter.ts:78)
这就是你的应用程序的问题所在 rxjs throw error操作符将停止可观测对象再次发射,就像您取消订阅可观测值更改一样 在使用throwError操作符时,可以这样尝试,只需抛出新的
错误对象即可
this.query.valueChanges
.pipe(map(d => (d === 'boom') ? new Error("boom") : d))
.subscribe(
d => console.log(d),
err => console.log(err),
() => console.log("complete")
)
rxjs throw error操作符将停止可观察对象再次发射,就像您取消订阅可观察的值更改一样
在使用throwError操作符时,可以这样尝试,只需抛出新的错误对象即可
this.query.valueChanges
.pipe(map(d => (d === 'boom') ? new Error("boom") : d))
.subscribe(
d => console.log(d),
err => console.log(err),
() => console.log("complete")
)
这不是一个bug。每个Rx流可以发出零个或多个next
通知和一个error
或complete
通知,但决不能同时发出这两个通知
因此,如果您使用throwerr
,该链将自行处理,因为您永远不会让同一条链发出两个或多个错误
通知,这正是您所期望的
显然有很多方法可以避免这种情况。例如,您可以使用不同于throwError
的东西,并使用某个对象包装输入值。但是您将无法在observer的错误处理程序中处理它
您还可以使用重试
和点击
来处理错误:
this.query.valueChanges
.pipe(
switchMap(d => (d === 'boom') ? throwError(new Error("boom")) : of(d)),
tap({ error: err => console.log(err) }),
retry(),
)
.subscribe({
next: d => console.log(d),
complete: () => console.log("complete")
})
您必须在此处使用点击,因为错误永远不会到达观察者
您更新的演示:这不是一个bug。每个Rx流可以发出零个或多个next
通知和一个error
或complete
通知,但决不能同时发出这两个通知
因此,如果您使用throwerr
,该链将自行处理,因为您永远不会让同一条链发出两个或多个错误
通知,这正是您所期望的
显然有很多方法可以避免这种情况。例如,您可以使用不同于throwError
的东西,并使用某个对象包装输入值。但是您将无法在observer的错误处理程序中处理它
您还可以使用重试
和点击
来处理错误:
this.query.valueChanges
.pipe(
switchMap(d => (d === 'boom') ? throwError(new Error("boom")) : of(d)),
tap({ error: err => console.log(err) }),
retry(),
)
.subscribe({
next: d => console.log(d),
complete: () => console.log("complete")
})
您必须在此处使用点击,因为错误永远不会到达观察者
您更新的演示:为什么要抛出错误。您可以返回(false/null)对吗?实际上这是一个愚蠢的问题,应该从SO中删除。我创建它的时候睡不着觉。为什么你要抛出错误。您可以返回(false/null)对吗?实际上这是一个愚蠢的问题,应该从SO中删除。当我创造它的时候,我睡不着觉。