vue子组件调用父组件方法,如何保证按照顺序执行(promise写的好像有问题)

发布于 2022-09-12 03:59:26 字数 852 浏览 10 评论 0

子组件
`

 save() {
    this.$refs.form.validate((valid) => {
      if (valid) {
        this.$axios
          .post(`/api/wordInfo/updateData.json`, data)
          .then((res) => {
            if (res.success) {
              this.getNature();   
this.$emit("getPassage", this.passageId);
              this.$emit("getSelectText", res.result);
              this.$emit("getMeaning", res.result.word);
              this.$emit("getWord", res.result);
            } else {
              this.$message.error(res.message);
            }
          });
      }
    });
  },

`

子组件的save方法完毕之后 要连续调用三个父组件的方法 由于 getPassage getSelectText getWord getMeaning 这四个方法都是 axios请求,并且需要严格按照顺序执行,切第一个执行完毕之后 第二个执行 第二个执行完毕之后 第三个执行 ...... 不然会影响到页面

开始改成了promise 但是 报错$emit undefined 感觉应该用promise实现 但是写起来好像有问题 求教各位

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甜尕妞 2022-09-19 03:59:26

层层嵌套有点麻烦,你可以这样来做:

// 子组件
...
表单提交成功后:
this.$emit('on-success', {
    passageId: this.passageId,
    result: res.result
})
...


// 父组件
<Child @on-success="handleFormSuccess" />

...
async handleFormSuccess(params) {
    try {
        const passage = await "getPassage" 的请求
        const selectText = await "getSelectText" 的请求
        const meaning = await "getMeaning" 的请求
        const word = await "getWord" 的请求
        
        // 做请求后的逻辑
    } catch (error) {
        // 错误提示
    }
}
...
橘虞初梦 2022-09-19 03:59:26

emit没有返回值,用不了promise,你只能在父组件每个函数内加个回调用来解决顺序执行的问题。
最终代码大概写成这样。

  this.$emit('getPassage', this.passageId, () => {
    this.$emit('getSelectText', res.result, () => {
      this.$emit('getMeaning', res.result.word, () => {
        this.$emit('getWord', res.result);
      });
    });
  });

个人建议你可以在父组件再封装个处理函数,把passageIdres.result传出去,让父组件直接按顺序处理这一系列的动作

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文