首页 > 解决方案 > 在 2 秒内执行第二个请求作为第一个请求

问题描述

我有两个要求。
我需要this.auth.login在执行后 2 秒内this._auth.create执行。

这不会发生在我身上。
我做错了什么?

auth() {
  this._auth.create(this.form.value).subscribe(
    () => {
      setTimeout(() => {
        this._auth.login(this.form.value).subscribe(
          () => {
            this.router.navigate(['/home']);
          },
          error => {
            this._toast.error(error.error.message);
          }
        );
      }, 2000)
      },
    error => {
      this._toast.error(error.error.message);
    }
  )
}

标签: angular

解决方案


尽量避免嵌套订阅。相反,您可以使用 RxJS运算符来混合和匹配多个(相互依赖的)可观察对象。

尝试以下

auth() {
  this._auth.create(this.form.value).pipe(
    delay(2000),
    switchMap(_ => this._auth.login(this.form.value))
  ).subscribe(
    _ => this.router.navigate(['/home']),
    error => this._toast.error(error.error.message)
  );
}

我使用delay运算符将​​通知从第一个请求延迟 2 秒,然后使用switchMap运算符将​​其切换到第二个请求。

但是在登录过程中引入固定延迟并不是好的设计。如果您在此延迟期间需要满足一些副作用,另一种方法是将这些副作用包含在路由过程中,并使第二个呼叫直接等待第一个呼叫而不是硬延迟。


推荐阅读