【问题标题】:VueJS Vuex - Promise that resolves on state change?VueJS Vuex - 解决状态变化的承诺?
【发布时间】:2019-03-11 19:26:58
【问题描述】:

是否可以创建一个 Promise,一旦全局 vuex 存储中的变量发生更改,它就会解析?

我有一个变量在状态存储中初始化为null,并将通过异步调用填充。
应用程序的不同部分取决于该变量是 truefalse 并且应该在它仍然是 null 时等待。

有没有办法干净地等待这个变量的变化?

【问题讨论】:

  • 谁进行异步调用?你不能立即用承诺填充变量吗?
  • 你的意思是把promise本身放在全局存储中?我还没有尝试过,但即使它可以工作,我也觉得不太对劲......全局状态不应该处于定义状态吗?我更愿意在 while(state.foo == undefined) { wait(100); } resolve(state.foo) 之外创建一个承诺,但我不知道这是否可行以及如何实现......

标签: javascript vue.js promise vuejs2 vuex


【解决方案1】:

您可以在表达式或函数上vm.$watch,然后wrap that with a promise

function watch(vm, fn) {
  return new Promise(resolve => {
    const watcher = vm.$watch(fn, (newVal) => {
      resolve(newVal);
      watcher(); // cleanup;
    });
  });
}

这会让你做类似的事情:

let change = await watch(vm, () => state.foo); // will resolve when state.foo changes

async function 中。

请注意,一般来说这不是一个很好的模式,在大多数情况下,为此使用computed property(而不是承诺)更可取且更简单。

【讨论】:

  • 我最终只是按照答案中的描述进行了轮询:stackoverflow.com/questions/30505960/… 但是您的解决方案看起来确实很有趣,下次我会记住这一点!
  • @TommyF 请小心为多个值执行此操作,因为它绕过了 Vue 自己的响应系统,该系统是为侦听更改而构建的。
  • 我明白了,我只是在实际的 vue 组件之外使用它。但是感谢您的警告。
  • 明确地说,我承认在某些情况下使用轮询可能更合适且更容易。例如,因为即使你重构了 vue,它也会继续工作。
【解决方案2】:

与本杰明的回答类似,而不是您所要求的,只是另一种选择。你可以subscribe 而不是观察状态变化,当特定类型的突变发生并将其包装到 Promise 中。

new Promise(resolve => {
      let unsubscribeFn = this.$store.subscribe(mutation => {
        if (mutation.type === "MY_MUTATION") {
          unsubscribeFn();
          resolve();
        }
      });
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2015-06-24
    • 2020-05-18
    相关资源
    最近更新 更多