如何在 Vuex 操作完成之前阻止 Vue 生命周期继续进行?

2023-12-08

在我的应用程序中,我想在应用程序的其余部分启动之前初始化 3 个 Vuex 模块。然而,无论我如何尝试,Vue 实例生命周期挂钩中执行初始化的代码都会在 3 个模块完成初始化之前继续运行。

我在执行初始化的 Vuex 操作中的代码周围添加了一个承诺,以便我可以 (a) 等待调用生命周期挂钩中的代码,但它不起作用。

我查看了使用 Axios 的示例 Vuex 代码,我必须使我的代码与此类似,但没有成功。

我尝试使用“Promise.all(...)”在“beforeCreate”生命周期挂钩中进行 init 调用,但这仍然没有解决问题。

我的主 Vue 实例的代码如下所示:

new Vue({
  router,
  store,
  async beforeCreate() {
    await this.$store.dispatch('init')
  },
  render: h => h(App)
}).$mount('#app')

Vuex 存储由 3 个模块组成,所有模块都有一个“init”操作。所有 3 个模块中的操作代码都是相同的。下面的代码中凡是有“XXX”的地方,每个模块的调用都会略有不同;

  init: ({commit, dispatch}) => {
    return new Promise((resolve, reject) => {
      console.log('Start of init of XXX');
      Axios.get(`api/xxx`).then(response => {
        return response.data;
      }, error => {
        console.log('An error occured: ', error);
        reject(error);
      }).then(data => {
        const result = [];
        for (let key in data) {
          result.push(data[key]);
        }

        console.log('The API call resulted in ' + result.length + ' lines of code');

        resolve(result);
        commit('ADD_XXX', result);
      })
    })
  }

我期望的是“beforeCreate”代码等待继续,直到 3 个 init 操作调用完全完成(即直到所有承诺都得到履行)。

我看到的是操作已启动(我在控制台中看到“Start of init...”日志)。但后来我看到应用程序组件之一的 Mounted() 函数中的代码开始执行,但它不应该执行,因为如果存储尚未完全初始化,它将无法正常工作。


你不能暂停beforeCreate通过制作它async。当您点击时,它可能看起来在内部“暂停”await但从外部角度来看,它只是返回一个承诺。 Vue 不会注意到返回值,因此承诺将被忽略,生命周期将不间断地继续。你可以做的就是添加一些状态到你的data并操纵它以达到预期的效果:

new Vue({
  router,
  store,
  data () {
    return {
      ready: false
    }
  },
  async beforeCreate() {
    await this.$store.dispatch('init')
    this.ready = true
  },
  render (h) {
     if (this.ready) {
       return h(App)
     }
  }
}).$mount('#app')

顺便说一句,您不需要创建新的承诺init,您只需返回 axios 创建的链式 Promise 即可。

Update:

还有另一种方法,就是不打电话mount.

new Vue({
  router,
  store,
  async beforeCreate() {
    await this.$store.dispatch('init')
    this.$mount('#app')
  },
  render: h => h(App)
})

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Vuex 操作完成之前阻止 Vue 生命周期继续进行? 的相关文章

随机推荐

  • 在表格边框上获取 Flutter DataTable 边框半径时出现问题

    我有一个DataTable我想添加一个边框半径 阅读完此内容后 我添加了DataTable to a Container小部件 当我不向标题添加背景颜色时 它效果很好 执行此操作时 整个表格的颜色都会改变 Container decorat
  • Python:通过套接字发送的消息大小

    我正在尝试使用发送消息socket图书馆 由于消息的大小是可变的 因此我决定在字符串的开头附加消息的大小 然后发送它 例如 如果消息是 Hello World 这是 13 个字符长 我已经计算过 EOL 我会发送类似的内容 sizeof13
  • 如何区分线条的各个部分?

    我有两个文件想要比较 这些行有时间戳 可能还有一些我想在匹配算法中忽略的其他内容 但如果匹配算法发现文本的其余部分存在差异 我仍然希望输出这些项目 例如 1c1 lt junit4 2013 01 11 04 43 57 392 INFO
  • 如何从字符串中删除最后一个字符

    这可能是一个简单的任务 但我是 PHP 新手 我正在创建一串从数据库获取的值以用于特定目的 如何从字符串中删除最后一个字符 str foreach dataarray as value str value 它给了我类似的字符串ABC DEF
  • Jaas - 请求可更新的 Kerberos 票证

    我有一个 Java API 它与 Kerberos 服务器通信并执行各种操作 截至目前 我的 API 向 Kerberos 服务器请求不可更新的票证 据我了解 jaas 配置文件有一个选项可以将 renewTGT 选项设置为 true 以便
  • OpenCV (C++) - 设置像素的 HSV 值

    我有一个 RGB 图像 已转换为 HSV 我的目标是将每个不满足特定色调值 100 的像素设置为黑色 所以 H S V 0 我有这个代码 frame3是HSV Mat图像 色调 100 for int i 0 i
  • 计算字符串中的单词数

    我正在自学C 我编写了这个程序来计算字符串中的单词数 我知道这不是最好的方法 但这是我能想到的 我正在使用空格来计算单词数 问题就在这里 countWords ok x empty identifies it as an empty str
  • 如何在 Javascript 中迭代文件

    是否可以在 Javascript 中迭代文件集合 我正在编写一个 jQuery 插件 它要么接受图像数组 要么接受包含图像列表的目录 例如 任何一个 image1 jpg image2 jpg image3 jpg or http some
  • 如何在c中打印数组的最后一个元素

    我想检测 C 代码中整数数组的最后一个元素 否则 当数组元素为空时 我需要停止处理数组数据 实际上 我的数组有固定的最大大小 并且它是从外部文件填充的 所以我不知道它何时停止填充数组 最后一个元素就位 sizeof array sizeof
  • 如何合并同一数组内具有相同 id 的对象?

    我需要解析我的应用程序的 API 以获取此对象数组 parsedPlan id start small degressive rate 0 22 small hourly rate 2 large degressive rate 0 27
  • Java 泛型类型擦除:何时以及会发生什么?

    我读到了有关 Java 类型擦除的内容在甲骨文网站上 什么时候发生类型擦除 在编译时还是运行时 类什么时 候加载 类什么时 候实例化 很多网站 包括上面提到的官方教程 都说类型擦除发生在编译时 如果在编译时完全删除类型信息 那么当调用没有类
  • 从一个 .ps 文件创建两个 pdf?

    我需要将文本文件重新格式化为 PDF 我使用 Perl 根据文本文件中的内容修改现有的 PostScript 模板文件 有时 此文本文件足够长 需要两页 PDF 我可以使用 GhostScript 从一个 ps 文件创建两页 PDF 文件吗
  • Glassfish 有一个进程已经在使用管理端口 4848

    asadmin start domain domain1 但它显示了这个错误 There is a process already using the admin port 4848 it probably is another insta
  • iOS 4.3 的 addChildViewController 替代方案

    我想使用与 addChildViewController 相同的功能 但对于版本 4 3 addChildViewController 仅在版本 5 中可用 提前致谢 尽管不建议这样做 但您可以创建一个实例UIViewController访
  • 使用 taglib 在 WPF 中的图像框中显示封面艺术

    我正在制作一个播放器 但我陷入了一个看似简单的问题 我需要将歌曲的封面艺术显示在一个图像框中 我找到了这两个解决方案 This var file TagLib File Create filename if file Tag Picture
  • 将两个表中的两列合并为一个表

    我正在尝试按两个不同表中的两个不同列进行排序 情况是这样的 我有 1 个表 shops 其中有一列名为 shopy 这是一个 INT 列 另一个表称为 infra 有一列称为 y 也是一个 INT 我想选择这两列并按它们排序 所以我会得到如
  • libjpeg 输出缩放

    libjpeg 是否允许 有例程来缩放输出图像 我有一个图像 在保存和加载时需要调整大小 在输入上提供宽度 1 高度 1 并在输出上获取宽度 2 高度 2 我真的不能使用外部的任何东西 是的 libjpeg 确实支持图像缩放 但有一些限制
  • 测量网站在线时间

    我想衡量用户在我的网站上花费了多少时间 社区网站需要它 您可以在其中说 用户 X 已在此处花费了 1397 分钟 在阅读了一些有关这方面的文档后 我知道没有完美的方法来实现这一点 你无法测量准确的时间 但我正在寻找一种能够提供良好近似值的方
  • 黄瓜:未定义步骤,尽管应该定义步骤

    我已经创建了以下步骤 Given the feed has an item published at do feed name feed item title published at feed Feed find by name feed
  • 如何在 Vuex 操作完成之前阻止 Vue 生命周期继续进行?

    在我的应用程序中 我想在应用程序的其余部分启动之前初始化 3 个 Vuex 模块 然而 无论我如何尝试 Vue 实例生命周期挂钩中执行初始化的代码都会在 3 个模块完成初始化之前继续运行 我在执行初始化的 Vuex 操作中的代码周围添加了一