【问题标题】:Angular rxjs debounce to limit user from sending multiple requestsAngular rxjs debounce 以限制用户发送多个请求
【发布时间】:2020-05-06 21:46:28
【问题描述】:

基本上我的问题是,当连接速度很慢时,用户可以多次按下保存按钮并且正在保存多个数据。此问题不会在本地发生,但在暂存时会发生。

虽然我已经设置了 this.hasBeenSubmitted = true;当请求完成并根据条件在按钮上[禁用]时,用户仍然能够多次单击按钮并且可以保存多次,这是错误的。

有人说 Angular rxjs debounce 可以解决这个问题,有人可以告诉我这个问题吗?谢谢你。根据下面的代码,它将如何帮助我解决问题。谢谢。

代码

save(): void {
    const create = this.requestFormService.createRequestData(this.form, this.respondents)
      .subscribe(
        (results: FeedbackRequest[]) => {
          this.hasBeenSubmitted = true;
        },
        (error) => {
          this.hasBeenSubmitted = false;
          this.handleInvalidFields(error, 'Failed to save the Feedback Request as draft. One or more fields contain invalid values. Input a valid value to proceed.');
          this.messageDialogService.show('Failed to save the Feedback Request as draft. One or more fields contain invalid values. Input a valid value to proceed.', true);
          create.unsubscribe();
        }
      );
  }

html

 <button [disabled]="form.invalid || (!duplicateMode && !form.dirty) || (!editMode) || hasBeenSubmitted"
        mat-raised-button *ngIf="form" (click)="save()" type="submit">
        <ng-container>
          <span>SAVE</span>
        </ng-container>
      </button>

【问题讨论】:

  • 为什么不在执行异步方法之前设置禁用标志?无论请求需要多长时间,这都将防止额外的按钮点击。您始终可以在成功或错误时重新启用。
  • 你的意思是在create()之前?
  • 是的,这在禁用按钮方面很常见。它不依赖于从服务器获得响应的时间长度。它立即被禁用。
  • 好的,但是在执行 create() 之前更新方法 save 以将 hasBeenSubmitted 设置为 true
  • 我所要做的就是打开多个标签,然后你就回到了第一格。您不能仅仅通过限制 Web 客户端的实例中的并发请求来解决此问题。

标签: javascript angular typescript rxjs


【解决方案1】:

如果我理解正确,您想限制用户多次点击保存,并且您说您已经应用了禁用条件。

您可以尝试重写您的保存按钮,如下所示。

save(): void {
    this.hasBeenSubmitted = true;
    const create = this.requestFormService.createRequestData(this.form, this.respondents)
      .pipe(
       take(1), 
       finalized(this.hasBeenSubmitted = false),
       ),
       catchError((err) =>{
          this.hasBeenSubmitted = false;
          this.handleInvalidFields(error, 'Failed to save the Feedback Request as 
          draft. One or more fields contain invalid values. Input a valid value to proceed.');
          this.messageDialogService.show('Failed to save the Feedback Request as 
          draft. One or more fields contain invalid values. Input a valid value to proceed.', true);
         create.unsubscribe();
      })
      .subscribe(
        (results: FeedbackRequest[]) => {

        }
      );
  }

我更改的主要内容是在创建调用之前执行this.hasBeenSubmitted = true;

希望对你有帮助。

【讨论】:

  • 什么是 pipe 、 take 、 finalized ?
  • 管道用于链接其他运算符,从 rx6 开始必须使用它,一旦流完成就会调用 Finalized
  • 现在当您说代码不起作用时,您能否详细说明它不起作用的原因。我的意思是任何编译时错误或按钮未禁用?
猜你喜欢
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
相关资源
最近更新 更多