以下代码给出了以下错误:
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);
} }
答案 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);
}
}