Дождитесь завершения сервисной функции - PullRequest
2 голосов
/ 28 мая 2020

У меня есть функция в моей службе, которая называется processPayment, эта функция получает сведения о платеже и выполняет несколько HTTP-вызовов, транзакций и проверок. Функция вызывается из компонента. Что я не смог найти, так это то, что я не хочу, чтобы эта функция обрабатывала какие-либо запросы, если она все еще работает, скажем, пользователь делает двойной щелчок или что-то еще, я хочу, чтобы функция игнорировала новые запросы во время ее работы до завершения. Это возможно? Должен ли я использовать сервисную функцию или горячую тему, наблюдаемую в сервисе? Может использовать exahustmap? Какой лучший шаблон дизайна для этого? Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

вам нужно использовать 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();
}
0 голосов
/ 28 мая 2020

, допустим, у вас есть компонент

public isCalled = false;

// Ваш метод, в котором вы вызываете API

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

Примечание: - С Rx js вы не сможете достичь это .. потому что все операторы пропуска и другие операторы работают над продолжающейся подпиской, чья подписка остается активной даже после первой отправки. В вашем случае вы вызываете api. Подписка завершается для этого вызова, и в исходном наблюдаемом источнике нет следующего вызова. каждый раз, когда вы щелкаете, вы создаете новую подписку.

...