Существует ли имя для шаблона, в котором предыдущее асинхронное действие автоматически отменяется при запуске нового действия? - PullRequest
2 голосов
/ 01 апреля 2019

Обычно пользователь пытается что-то сделать до того, как завершится предыдущее продолжительное действие.Это может привести к нескольким действиям, стремящимся изменить состояние приложения.

Одно простое решение - отменить все действия, кроме последнего.

У него есть имя?

Наиболее близким вопросом, который я мог найти, был вопрос об отмене предыдущего действия, когда новое действие происходит , но и автор, и ответы говорят только о реализации.

redux-saga имеет takeLatest (упомянутый в вопросе выше), который делает более или менее то же самое, но работает над сагой.Имя «takeLatest», по-видимому, нигде не встречается и не ссылается ни на что.

Пример реализации:

class AsyncActionSlot {
  // Cancellable promises used only to make this example simpler.
  private _promise: BluebirdPromise<string> | null = null;

  // Can be useful to check if the last process has
  // already finished running. Not used anywhere
  // else in this example.
  public get isBusy(): boolean {
    return this._promise !== null;
  }

  public cancel(): void {
    if (this._promise) {
      this._promise.cancel();
      this._promise = null;
    }
  }

  public do(promise: Promise<string>, callback: (msg: string) => void): void {
    this.cancel();

    this._promise = Bluebird.resolve(promise);
    this._promise.then((msg) => {
      this._promise = null;
      callback(msg);
    });
  }
}

Пример использования:

const slot = new AsyncActionSlot();

// will be cancelled, won't print `'hello'`
slot.do(fetchHello(), console.log);

// will print `'world'`
slot.do(fetchWorld(), console.log);
...