【问题标题】:Wait for service function to complete等待服务功能完成
【发布时间】:2020-05-29 03:42:59
【问题描述】:

我的服务上有一个名为 processPayment 的函数,该函数获取付款详细信息并执行多个 http 调用、事务处理和验证。该函数是从组件调用的。 我找不到的是,如果它仍在运行,我不希望这个函数处理任何请求,比如说用户双击或者我希望函数在运行直到完成时忽略新请求。 这可能吗?我应该使用服务功能还是可以在服务上观察到的热门主题?也许使用exahustmap? 最好的设计模式是什么? 谢谢!

【问题讨论】:

  • 您将要禁用触发该功能的任何内容,以便用户在请求完成之前无法再次单击它。您可以在组件中使用简单的布尔值来实现这一点。
  • 您能提供更多上下文吗?例如:如何/何时从组件调用processPayment;你需要processPayment的结果吗?

标签: angular rxjs


【解决方案1】:

你需要使用exhaustMap,它会忽略这些东西,直到子流有 已完成。

process = new Subject();

constructor() {
  this.process.pipe(
    // unless the request isn't finished all emits of this.process will be ignored.
    exhaustMap(() => this.http.post()),

    // takeUntil(this.destroy$), // unsubscribe
  ).subscribe(response => {
    // some logic.
  });
}

processPayment() {
  this.process.next();
}

【讨论】:

  • 但是我如何从这个函数中得到结果呢?
  • 例如在订阅中添加一个处理程序。我已经更新了答案。
【解决方案2】:

假设你有一个组件

public isCalled = false;

//你调用API的方法

public callAPI() {
    if(this.isCalled) {
           return;
    }
    this.isCalled = true;
    this.http.get('url').subscribe(()=>this.isCalled=false;);
}

注意 :- 使用 Rxjs 你将无法实现它..因为所有跳过运算符和其他运算符都在继续订阅,即使在第一次发出后订阅仍然有效。在您的情况下,您正在调用 api。该调用的订阅已完成,并且原始可观察源中没有下一个调用。每次点击您都在进行新订阅。

【讨论】:

  • 谢谢大家,但这是“老式”的方式,有没有 rxjs 方式?
  • 您只想防止双击?
  • 谢谢大家,请看看我在这里描述的 rxjs 解决方案:stackoverflow.com/questions/61867393/… 请让我知道这是否有效,它使用 exahustmap 并确保 handleSeatClick 只会处理一个请求一次,我不想在这里发明轮子,所以这是可以接受的实现方式吗?
  • 在此,您正在使用的解决方案我相信您将持续订阅该主题。请在销毁中取消订阅。
  • 是的,主题总是被订阅的,因为单例服务我认为我不需要取消订阅,但是您对整体方法有何看法?我是 Angular 和 rxjs 的新手..
猜你喜欢
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 2020-08-14
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多