【问题标题】:Only one MobX-State-Tree flow active at a time一次只有一个 MobX-State-Tree 流处于活动状态
【发布时间】:2021-05-05 17:27:34
【问题描述】:

我有一个 MobX-State-Tree (MST) 存储,其操作是 flow,它异步获取一些项目。可以从应用程序中的多个位置调用此操作,有时甚至可以同时调用,但我只希望一次激活一个 flow

MST 中是否有任何方法可以返回当前活动的flow(如果有),或者如果没有则创建一个新的?

示例

const Thing = types.model({
  id: types.identifier,
  name: types.string,
});

const ThingStore = types
  .model({
    things: types.array(Thing),
  })
  .actions((self) => ({
    // This action will create a new flow every time it is called.
    fetchThings: flow(function* () {
      const things = yield fetchThings();

      self.things = things;
    }),
  }));

【问题讨论】:

    标签: javascript mobx mobx-state-tree


    【解决方案1】:

    您可以创建一个volatile state 片段,它保留对调用flow 时返回的承诺的引用。如果flow 已经处于活动状态,我们将返回此承诺。如果没有,我们创建一个新的flow 并返回它。

    示例

    const Thing = types.model({
      id: types.identifier,
      name: types.string,
    });
    
    const ThingStore = types
      .model({
        things: types.array(Thing),
      })
      .actions((self) => {
        let fetchThingsPromise = null;
        const fetchThings = flow(function* () {
          try {
            const things = yield fetchThings();
    
            self.things = things;
          } finally {
            fetchThingsPromise = null;
          }
        });
    
        return {
          fetchThings: function () {
            if (fetchThingsPromise) return fetchThingsPromise;
    
            fetchThingsPromise = fetchThings.apply(null, arguments);
            return fetchThingsPromise;
          },
        };
      });
    

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 2020-05-07
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2021-11-21
      相关资源
      最近更新 更多