'等待'不在异步功能中工作

时间:2018-04-14 15:55:08

标签: javascript node.js promise async-await

以下代码给出了以下错误:

  

SyntaxError:await仅在异步函数

中有效
async function getLastTransaction() 
{
    paymentsApi.listPayments(locationId, opts).then(function(transactions) 
    {
        if(transactions[transactions.length-1] === undefined)
            return; //no new transaction yet

        var last_transaction_id = transactions[transactions.length-1].id;
        var last_transaction_in_queue; 

        try {
            last_transaction_in_queue = JSON.parse(order_queue[0]).order_id;
        } catch (e) {
            last_transaction_in_queue = order_queue[0].order_id;
        }

        //check if latest transaction is the same as lastest transaction in queue
        if(last_transaction_id !== last_transaction_in_queue) {

            console.log(`new payment...`); 

            var obj = await createTransactionObject(transactions[transactions.length-1], () => {
                order_queue.unshift(obj);
                console.log('new added', order_queue);
            });
}

我不理解错误,因为我使用await作为同一个函数createTransactionObject()但是在另一段代码中。

例如,在以下代码中,我没有收到错误,但仍然在await之前使用createTransactionObject()

async function populateQueue(transaction_list)  {
    for(var i = 0; i < transaction_list.length; i++) 
    {
        var transaction_json = await createTransactionObject(transaction_list[i], () => {});
        order_queue.unshift(transaction_json);
    } }

4 个答案:

答案 0 :(得分:3)

您需要更改此行:

paymentsApi.listPayments(locationId, opts).then(function(transactions)

到此:

paymentsApi.listPayments(locationId, opts).then(async (transactions) =>

你提供给你的匿名功能。然后需要进行,因为你在其中使用await。

您也可以用此替换该行(可能更好):

const transactions = await paymentsApi.listPayments(locationId, opts);

因为getLastTransaction函数是asynced。

答案 1 :(得分:1)

首先,您收到错误,因为getLastTransaction函数是异步但是,因为匿名函数.then(function(transactions) 不是异步,并在其中使用await。你不能这样做。

现在请注意,简单地将函数重新声明为async function(transactions)将在语法上正确但是这样可以正常工作吗?现在发生的事情是getLastTransaction在后​​台触发了一些异步进程,从不等待结果。这就是你想要的吗?

要解决这个问题,你必须问问自己:我想要实现的目标是什么? getLastTransaction应该等待内部函数正在做什么吗?然后使用async声明:

async function getLastTransaction() {
    const transactions = await paymentsApi.listPayments(locationId, opts);
    // Some other code here
    return xyz;
}

这是假设paymentsApi是异步/等待兼容的。如果不是,那么你必须使用手动创建和返回Promise个对象(在这种情况下async声明将无济于事)。

答案 2 :(得分:0)

paymentsApi.listPayments(locationId, opts).then(function(transactions)应该是 paymentsApi.listPayments(locationId, opts).then(async function(transactions) await只能用于asynchronous function

更好的是,由于您已经在顶层设置了async功能,为什么不仅仅await paymentsApi.listPayments(locationId, opts)而不是用{{1}链接它}?

then

答案 3 :(得分:0)

当范围使用await关键字时,

async关键字有效,此处.then接受没有async的回调函数,因此await在这里变得陌生。

让我们以async-await样式重写您的代码:

async function getLastTransaction() 
{
    // #1 this fixes to adopt the await style and fixes the problem
    const transactions = await paymentsApi.listPayments(locationId, opts);

    // your rest code goes here ...

    if(last_transaction_id !== last_transaction_in_queue) {
            //now do it like this, await will make sense now
            const obj = await createTransactionObject(transactions[transactions.length-1]);
            order_queue.unshift(obj);
    }
}