Можно ли объединить несколько задач из одной макро-временной шкалы в одну микро-задачу? - PullRequest
1 голос
/ 30 марта 2020
class stateSetter {
  cache = {};
  timeout = 0;
  set = <T>(
    params: stateSetterParams
  ) => <K extends keyof T>(newState: {
    [P in K]: T[P]
  }): void => {
    const {
      _setState
    } = params;
    this.cache = {
      ...this.cache,
      ...newState
    };
    clearTimeout(this.timeout);
    this.timeout = setTimeout(() => {
      _setState((prevState: T) => ({
        ...prevState,
        ...this.cache
      }));
      this.cache = {};
    });
  };
}

В приведенном выше примере я использую setTimeout для объединения нескольких setState с одной временной шкалы макроса.

setState({ ... });
setState({ ... });

Как указано выше.

Теперь, если я хочу использовать Promise ( Потому что это было бы более эффективно, чем setTimeout), я попытался:

class stateSetter {
  cache = {};
  promises = [];
  set = <T>(
    params: stateSetterParams
  ) => <K extends keyof T>(newState: {
    [P in K]: T[P]
  }): void => {
    const {
      _setState
    } = params;
    this.cache = {
      ...this.cache,
      ...newState
    };
    promises.push(Promise.resolve());
    Promise.all(promises).then(() => {
      _setState((prevState: T) => ({
        ...prevState,
        ...this.cache
      }));
      this.cache = {};
      this.promises = [];
    });
  };
}

Это не работает. Почему? Как я могу изменить его?

...