Vue async-await误区解析:同步执行与预期不符
版权申诉
7 浏览量
更新于2024-09-11
收藏 135KB PDF 举报
在 Vue 开发中,`async/await` 是一种处理异步操作的优雅方式,它使得异步代码看起来更像同步,易于理解和维护。然而,在使用 `async` 函数作为 Vue 钩子(如 `created` 或 `mounted`)时,需要注意一些常见误区。
首先,理解`async`函数的作用是将异步操作包裹在一个可等待的 Promise 对象中,使得开发者可以使用 `await` 关键字暂停执行直到 Promise 解决或拒绝。然而,这并不意味着异步代码会立即同步执行,因为 Vue 的生命周期钩子依然按照它们的声明顺序执行,即使其中包含了 `await`。
在给定的示例 `exp-01` 中,`created` 钩子被标记为 `async`,试图通过这种方式让 `this.list = await this.getList()` 这一行代码同步执行。然而,由于 Vue 的生命周期钩子是顺序执行的,当 `created` 钩子遇到 `await` 时,控制权并没有交给 JavaScript 异步执行栈,而是等待 Promise 完成后再继续执行下一个钩子。
实际上,`getList` 返回的是一个延时的 Promise,3秒后才会返回数据。所以在 `created` 钩子中,`this.list` 被设置为 `undefined`,因为这时数据还未从 `getList` 中获取到。随后,`mounted` 钩子开始执行,打印出 `this.list.rows` 为空,因为 `this.list` 仍然是空的。
在 `mounted` 钩子执行完毕后,`created` 钩子才完成其异步部分,此时 `this.list` 已经有了数据。这就是为什么我们看到 `startmounted` 在 `startcreated` 之后输出的原因,而 `endmounted` 和 `endcreated` 的时间顺序也反映了这个执行顺序。
总结来说,虽然 `async/await` 可以简化异步代码的编写,但在 Vue 的生命周期钩子中使用它并不会改变钩子本身的执行顺序。如果期望在钩子内同步地处理异步操作,可能需要重新考虑任务的调度逻辑,例如使用 `v-once` 或者在适当的地方更新视图,而不是依赖 `async/await` 自动调整执行流程。同时,对于 Vue 生命周期钩子,`async` 的使用应该谨慎,以免混淆开发者对代码执行顺序的理解。
2020-10-15 上传
2021-08-04 上传
2020-10-15 上传
点击了解资源详情
2023-06-28 上传
2021-03-14 上传
2019-09-17 上传
点击了解资源详情
2023-11-16 上传
weixin_38593644
- 粉丝: 4
- 资源: 914