如何在subscribe方法中仅发出最后一个请求

奥列格·谢戈列夫(Oleg Shchegolev)

我使用concatMap运算符内部的复杂逻辑发送表单一切正常,但是在我的订阅方法中,我还有其他的http请求,它触发2次而不是1次。我尝试使用takeLastoperator,但没有帮助。只有在中完成所有请求后,我才需要使用Subscribe方法发出请求concatMap例如,如果我有两个updateMember()事件,则在每个请求之后,我都会从Subscribe方法中调用函数。

makeRequest(value) {
  const team = toFormData(this.form.controls.profile.value);

  this.teamService
  .sendTeam(team)
  .pipe(
    concatMap(() => {
      const tasks$ = [];

      for (const [index, m] of this.form.controls.members.value.entries()) {
        const member = toFormData(m);

        if (m.id) {
          tasks$.push(this.teamService.updateMember(member, m.id).pipe(take(1)));
        } else if (!member.entries().next().done) {
          if (member.has('name')) {
            tasks$.push(this.teamService.createMember(member).pipe(take(1)));
          } else {
            (this.form.controls.members as FormArray).controls[index].markAllAsTouched();
            this.scrollToFirstInvalidControl();
          }
        }
      }

      return tasks$.length ? concat(...tasks$) : EMPTY;
    }),
  )
  .subscribe(() => {

    this.teamService.getMembers().subscribe();

  });
}

我应该使用什么来仅发出必要的请求?

安德烈·盖特伊(AndreiGătej)

我认为使用takeLast是个好主意,但放置位置很重要:

this.teamService
  .sendTeam(tem)
  .pipe(
    concatMap(() => {
      /* ... */

      return tasks.length ? concat(...tasks).pipe(last()) : EMPTY;
    }),

    // You can avoid to manually subscribe in the `subscribe`'s callback
    switchMap(() => this.teamService.getMembers())
  ).subscribe()

concatMap 订阅通过调用提供的回调函数产生的可观察结果。

在这种情况下,该observable可以是concat(...tasks).pipe(last())EMPTY

如果是concat(...tasks).pipe(last()),它将等待每个task完成。lasttakeLast(1)内部也使用

顺便说一下,concat可以这样看:

// concat(observables[])

from(observables[])
  .pipe(
    mergeMap(obs$ => obs$, 1)
  )

如果是EMPTY,它将立即发送完整的通知,这意味着将不会调用teamService.getMembers()from switchMap(() => this.teamService.getMembers())

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在另一个 subscribe() 中发出 HTTP 请求?

RxSwift - 如何在 observable 更改但仅发出最后一个值时重试?

如何在GenServer Elixir中不等待前一个请求完成而每秒发出请求

如何仅发出 Observable 的一个或最后一个值?

如何仅显示最后一个ajax请求结果

如何仅通过一个HTTP请求从事件存储流中获取最后一个事件?

如何在angularjs中仅发送一个请求而不是多个请求?

如何在shopify中仅获取php中数组的最后一个值

如何仅重塑numpy中的最后一个尺寸?

发出多个异步请求,但仅等待一个

如何在Smarty中截断请求URI以仅获取第一个块?

仅选择多个传递请求中的最后一个选定值

RxJS CombineLatest:如何在仅更改一个值后发出信号?

如何在 Laravel 测试中代表另一个会话发出 HTTP 请求?

如何在Github上对用户的所有存储库发出一个异步请求

如何发出ajax请求以在一个模板中获得两个不同的视图

如何在shell中获取最后一个参数

https 请求在循环中,在发出最后一个请求后调用函数节点

如何在python中串联列表,但如果元素相等则仅保留相邻列表的最后一个或第一个元素

如何通过 Angular httpClient 中的一个套接字连接发出多个请求?

如何制作一个在颤动中每秒发出请求的函数

如何在EditText中仅允许一个单词?

如何在python中使用itertools仅打印最后一个匹配项?

如何在猫鼬中获取最后一个记录的一个值

RxJava与用户创建的Flowable合并仅发出最后一个Flowable

如何匹配这些单词中的任何一个,但仅匹配.NET Regex列表中的最后一个

如何在Swift4中仅获取结构数组中每个唯一名称的最后一个值?

如何在REACT INFINITE中为每个页面仅发出一次API请求,请滚动此处

如何在shell脚本中获取最后一个参数并在最后一个参数之前停止?