【问题标题】:Do I need to put await before every statement in an async function?我需要在异步函数中的每个语句之前放置等待吗?
【发布时间】:2019-12-30 22:50:22
【问题描述】:

我有一个异步函数,其中一些事情似乎在其他事情乱序之前执行。我认为这是因为我正在使用异步函数。但是我怎样才能让它以正确的顺序执行(它的编写方式?)。我需要在每个这样的陈述之前加上await吗?

还是我的语法不正确?

async foodDelivered(order_id, table_id)
{
    await let tmp_order_id = order_id
    await let deliveryTime = 0

    await this.btnDeliveredLoading = true

    await const index = store.table_timers.findIndex(({ order_id }) => order_id === tmp_order_id)

    await if (index != -1) {
        // Stop timer
        await clearInterval(store.table_timers[index].interval)

        // Remove timer
        await store.table_timers.splice(
            store.table_timers.findIndex(({ order_id }) => order_id === tmp_order_id), 1
        )

        await deliveryTime   = store.table_timers[index].time
    }

    try {

        await OrderHistory.updateColor({
            order_id: order_id,
            table_id: table_id,
            action: 'FOOD_DELIVERED',
        })

        // Save delivery time
        await OrderHistory.saveDeliveryTime({
            deliveryTime:   deliveryTime,
            order_id:       order_id,
        })

        // Refresh
        await OrderHistoryClass.getTotalOrderHistory({
            date: moment().format('YYYY-MM-DD'),
        })

        let tables = await Data.getTables()
        await store.tables = tables.data

        await this.drawerOpened = false
    }

    await this.btnDeliveredLoading = false
},

【问题讨论】:

  • 您应该只 awaitasync 的东西(或者是/返回 Promise)。是 in 这个函数还是 outside 这个函数(即你需要await这个函数的调用,以确保一切都在这里完成,如果你有代码取决于这是否完成)。
  • 究竟发生了什么“乱序”?您是否确保您调用的所有异步函数都返回一个在完成之前没有实现的承诺?
  • “有些事情似乎在其他事情之前执行”:请提供一个可重现的例子。现在,您有许多我们不知道的函数调用,因此我们无法看到发生了什么。

标签: javascript asynchronous async-await es6-promise


【解决方案1】:

仅在预期返回Promise 符号的语句中使用等待,直到返回承诺。所以,不是在每条指令中,而是在你需要的地方。

【讨论】:

  • 谢谢,但是我怎么知道一个语句是否返回了一个承诺?
  • @Liga:你怎么知道函数返回什么值?当你调用一个函数时,你通常应该知道它期望什么输入以及它提供什么输出。不然怎么确定调用正确?
  • @Liga 任意语句/表达式通常会 not 返回一个承诺,就像代码中的所有这些分配一样。唯一可以返回承诺的是函数调用。
  • 谢谢,这对我来说是有意义的,将 await 放在那些返回承诺的语句之前。我找到了解决方案!
【解决方案2】:

绝对是你认为的错误。你只需要在异步函数之前添加await,而不是每个语句。

async function logAsync(a) {
    return Promise.resolve(a);
}

function logSync(a) {
    console.log(a);
}

function combination() {
    // you only add await before async functions
    await logAsync("async 1");
    // this does not need await before
    logSync(1);
    logSync(2);
    logSync(3);
}

【讨论】:

    【解决方案3】:

    将整个块包装在 try catch 中,并将 await 放在返回 Promises 的语句之前

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      相关资源
      最近更新 更多