async函数执行乱序如何解决?是否需在每条语句前加await?
解决Async函数执行顺序混乱的问题
嘿,你的问题核心是对await的用法理解有误——你给大量同步操作加了await,这不仅是多余的,还会导致语法错误和逻辑混乱。先给你理清关键知识点,再帮你修正代码:
什么时候需要用await?
await只能用于返回Promise的异步函数调用,它的作用是暂停async函数的执行,等待Promise完成后再继续往下走。对于同步操作(比如变量声明、赋值、if判断、clearInterval这类同步API),完全不需要加await,它们本来就是按顺序同步执行的。
你的代码里的错误点
- 变量声明前加
await是语法错误:await let tmp_order_id = order_id这种写法根本不合法,await后面必须跟一个表达式,而变量声明是语句,不能用await修饰。 - 同步操作加
await毫无意义:比如await this.btnDeliveredLoading = true、await clearInterval(...),这些同步代码不需要等待,加await只会让代码逻辑变混乱,甚至可能引发意外行为。 - 错误的try/catch结构:你把
this.btnDeliveredLoading = false放在try外面用await,这样不管异步操作成功还是失败,它都会执行,但更好的做法是放在finally块里,确保loading状态一定会被重置。
修正后的代码
async foodDelivered(order_id, table_id) { // 同步变量声明,不需要await let tmp_order_id = order_id let deliveryTime = 0 // 同步赋值,不需要await this.btnDeliveredLoading = true const index = store.table_timers.findIndex(({ order_id }) => order_id === tmp_order_id) if (index !== -1) { // clearInterval是同步API,不需要await clearInterval(store.table_timers[index].interval) // splice是同步数组方法,不需要await store.table_timers.splice(index, 1) // 注意:splice后index位置的元素已被移除,这里需要根据实际逻辑调整取值 deliveryTime = store.table_timers[index]?.time || 0 } try { // 这些是异步Promise调用,需要加await保证顺序执行 await OrderHistory.updateColor({ order_id: order_id, table_id: table_id, action: 'FOOD_DELIVERED', }) await OrderHistory.saveDeliveryTime({ deliveryTime: deliveryTime, order_id: order_id, }) await OrderHistoryClass.getTotalOrderHistory({ date: moment().format('YYYY-MM-DD'), }) // 等待异步请求完成后再赋值 const tables = await Data.getTables() store.tables = tables.data this.drawerOpened = false } catch (error) { // 捕获异步操作的错误,避免函数静默失败 console.error('处理订单完成时出错:', error) // 可在此添加用户提示逻辑 } finally { // 不管异步操作成功/失败,都要关闭loading this.btnDeliveredLoading = false } }
额外注意点
- 修正代码中给
deliveryTime的取值加了可选链?.,因为splice会直接修改原数组,移除index位置的元素后,原位置的内容会发生变化,原写法可能触发undefined报错,你可以根据实际业务逻辑调整这部分。 - 一定要给
try块搭配catch,否则异步操作失败时,整个async函数会抛出未捕获的Promise错误,导致程序异常。
内容的提问来源于stack exchange,提问作者Liga
相关产品推荐
相关产品推荐

