Javascript 如何使用异步操作维护订阅服务器的顺序

Javascript 如何使用异步操作维护订阅服务器的顺序,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,我有一个角度分量,它订阅了它的路由参数。每当路由参数发生更改时,它都会从参数中读取id,并调用一个函数来查找该id的记录。该函数返回一个承诺。解析时,组件会为其自身设置一个属性以进行数据绑定 在某些情况下,似乎响应出现了问题,设置了错误的值。下面是它的样子: ngOnInit() { this.route.params.subscribe((params) => { const id = params['id']; console.log('processing', i

我有一个角度分量,它订阅了它的路由参数。每当路由参数发生更改时,它都会从参数中读取
id
,并调用一个函数来查找该id的记录。该函数返回一个承诺。解析时,组件会为其自身设置一个属性以进行数据绑定

在某些情况下,似乎响应出现了问题,设置了错误的值。下面是它的样子:

ngOnInit() {
  this.route.params.subscribe((params) => {
    const id = params['id'];
    console.log('processing', id);
    this.service.getPerson(id).then((person) => {
      console.log('processed id', id);
      this.person = person; // sometimes this happens out of order
    }
  }
}
所以,假设我有一个文本框,我在其中按名称过滤,当我键入时,导航事件发生在
id
获取该名称的第一个结果的地方。有时我看到:

处理1

处理2

处理2


processed 1您可以为返回给您的每个呼叫添加一个“请求id”。然后在回调中,您可以检查req id是否高于您处理的上一个id


它不适用于具有单整数响应的小调用,但我将我的消息隐藏在消息头中,并在每次请求时使用拦截器/过滤器将该消息头回显到客户端。

您可以为每个返回给您的调用添加“请求id”。然后在回调中,您可以检查req id是否高于您处理的上一个id


它不适用于带有单整数响应的小调用,但我将我的消息隐藏在消息头中,并在每次请求时使用拦截器/过滤器将该消息头回显到客户端。

您可能希望使用或
concatMap
将确保在执行下一个请求之前完成前一个请求的处理
switchMap
也将确保订单,但如果在下一个请求到来时仍在处理,则会中止对上一个请求的处理

ngOnInit(){
此.route.params.pipe(
映射(params=>params['id']),
点击(id=>console.log('processing',id)),
concatMap(id=>fromPromise(this.service.getPerson(id)).pipe(
点击(person=>console.log('processed id',id))
)), 
点击(person=>this.person=person)
)
.subscribe();
}

您可能希望使用或
concatMap
将确保在执行下一个请求之前完成前一个请求的处理
switchMap
也将确保订单,但如果在下一个请求到来时仍在处理,则会中止对上一个请求的处理

ngOnInit(){
此.route.params.pipe(
映射(params=>params['id']),
点击(id=>console.log('processing',id)),
concatMap(id=>fromPromise(this.service.getPerson(id)).pipe(
点击(person=>console.log('processed id',id))
)), 
点击(person=>this.person=person)
)
.subscribe();
}

您可能可以在管道中使用
concatMap
,以确保按顺序处理这些页面请求。然而,如果在最后一个请求完成之前有一个新的请求,你真的在乎之前的请求吗?通常您不会也应该使用
switchMap
this.route.params.pipe(switchMap(params=>this.service.getPerson(params['id'])。然后(person=>this.person=person)))
正确,我不关心中间值。我会查一下开关地图,然后给你回复。我目前正在通读所有的操作员。为了完整起见,
debounceTime
也确实缓解了这种情况,只要我能够预测我的
getPerson
将花费的最长时间。但这并不好:)您可能可以在管道中使用
concatMap
,以确保按顺序处理这些页面请求。然而,如果在最后一个请求完成之前有一个新的请求,你真的在乎之前的请求吗?通常您不会也应该使用
switchMap
this.route.params.pipe(switchMap(params=>this.service.getPerson(params['id'])。然后(person=>this.person=person)))
正确,我不关心中间值。我会查一下开关地图,然后给你回复。我目前正在通读所有的操作员。为了完整起见,
debounceTime
也确实缓解了这种情况,只要我能够预测我的
getPerson
将花费的最长时间。但这并不好:)