vue利用async和await异步变同步问题

发布于 2022-09-12 00:14:27 字数 1564 浏览 17 评论 0

测试代码

mounted(){  
  this.test();  
},  
methods:{  
  test(){  
    this.testapi1();  
    this.testapi2();  
  },  
  testapi1(){  
    console.log('testapi1 start');  
     this.$request({  
      url:'/api',  
      method:'post',  
      data:{}  
    }).then(data=>{  
      console.log('testapi1 data')  
    });  
    console.log('testapi1 end')  
  },  
  testapi2(){  
    console.log('testapi2 start');  
    this.$request({  
      url:'/api',  
      method:'post',  
      data:{}  
    }).then(data=>{  
      console.log('testapi2 data');  
    });  
    console.log('testapi2 end');  
  }  
}

我现在想要的预期输出结果是

testapi1 start
testapi1 data
testapi1 end
testapi2 start
testapi2 data
testapi2 end

我知道应该用async配合await,但我自己试了下边两种写法都不行

  • 第一种写法
async testapi1(){  
    console.log('testapi1 start');  
     await this.$request({  
      url:'/api',  
      method:'post',  
      data:{}  
    }).then(data=>{  
      console.log('testapi1 data')  
    });  
    console.log('testapi1 end')  
  }
  • 输出结果
testapi1 start
testapi2 start
testapi2 end
testapi1 data
testapi1 end
testapi2 data
  • 第二种
async test(){  
    await this.testapi1();  
    this.testapi2();  
  },  
  • 输出结果
testapi1 start
testapi1 end
testapi2 start
testapi2 end
testapi1 data
testapi2 data

请问该怎么写才能实现我要的效果?

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

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

发布评论

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

评论(3

↘人皮目录ツ 2022-09-19 00:14:27

原则就是——在异步但需要等待的地方await,或者说是异步但需要异步执行完再往下走的地方await,这里是尽量按照你原有的代码写的,实际上request的响应是可以通过await拿到的,不需要then

{
// ...
    created(){
        this.test();
    },
    methods: {
        async test() {
          await this.test1();
          this.test2();
        },
        async test1() {
          console.log('test1 start');
          await this.request().then(() => console.log('test1 data'));
          console.log('test1 end');
        },
        async test2() {
          console.log('test2 start');
          await this.request().then(() => console.log('test2 data'));
          console.log('test2 end');
        },
        request() {
          return new Promise((resolve) => {
            setTimeout(() => {
              resolve(Math.random());
            }, Math.floor(Math.random() * 100));
          });
        },
    }
}
ゞ记忆︶ㄣ 2022-09-19 00:14:27
mounted(){  
  this.test();  
},  
methods:{  
  async test(){  
    await this.testapi1();  
    await this.testapi2();  
  },  
  async testapi1(){  
    console.log('testapi1 start');  
    let res = await this.$request({  
      url:'/api',  
      method:'post',  
      data:{}  
    })
    console.log('testapi1 data') 
    console.log('testapi1 end')  
  },  
  async testapi2(){  
    console.log('testapi2 start');  
    let res = await this.$request({  
      url:'/api',  
      method:'post',  
      data:{}  
    })
    console.log('testapi2 data');
    console.log('testapi2 end');  
  }  
}

没测试过你看看这样子行不行

韬韬不绝 2022-09-19 00:14:27

首先你这种写法就错了 console.log('testapi1 end') 是同步执行不可能在 console.log('testapi1 data') 之后

另外 testapi1 只应该吧 return this.$request

methods:{  
  async test(){  
    await testapi1()
    console.log('testapi1 end')
    await testapi2()
    console.log('testapi2 end')
  },  
  testapi1(){  
    console.log('testapi1 start');  
    return this.$request({  
      url:'/api',  
      method:'post',  
      data:{}  
    }).then(data=>{  
      console.log('testapi1 data')  
    });  
  },  
  testapi2(){  
    console.log('testapi2 start');  
    return this.$request({  
      url:'/api',  
      method:'post',  
      data:{}  
    }).then(data=>{  
      console.log('testapi2 data');  
    });  
  }  
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文