Angular 角度反应形状值随管道而变化。这是虫子吗???

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

管道似乎不适用于被动表单控件值更改。我准备了这个,这样你就可以重现这个问题了

在文本字段中键入内容。然后键入“boom”(不带引号)。错误捕获后,控件不再工作。 之后,您可以验证是否在其上键入了新内容。它不检测任何其他输入

如果刷新页面,则它将再次工作


我是不是遗漏了什么

是的,你肯定错过了什么

打开您的控制台(浏览器控制台,而不是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中删除。当我创造它的时候,我睡不着觉。