首页 > 解决方案 > 在第 n 个而不是第一个使用 async 和 await ?

问题描述

SyntaxError: await 仅在异步函数和模块的顶层主体中有效

错误准确地显示了问题所在,但是如果我想在 nTH 函数 await 中使用,什么是绕过?

要更清楚。address_submited()从 html 调用onclick=address_submited()

它读取 wallet_address 并开始按来自 的GET请求获取数据OpenSea。根据结果​​,可能会有多个调用。此函数通过回调解决,因此“它等待”直到它获取所有数据。

现在在 for 循环中获取数据后,它应该为每个成员执行另一个 API 调用。由于提供商限制每分钟 50 次呼叫,我们需要增加一些延迟。这就是为什么我添加了await new Promise(r => setTimeout(r, 2000));

不是它让我回到这个问题上描述的开始:等待仅在异步函数中有效

async function address_submited() {
    const wallet_address = $('#wallet_id').val()
    start_app(wallet_address, 0, [])
}

function start_app(wallet_id, offset, all_events) {
    $.get('https://api.opensea.io/api/v1/events',
        {
            "account_address": wallet_id,
            "only_opensea": "false",
            "event_type": "successful",
            "offset": offset,
            "limit": "50"
        }).done(function (return_data) {
            all_events = all_events.concat(return_data['asset_events'])
            offset += return_data['asset_events'].length
            if (return_data['asset_events'].length != 0) {
                start_app(wallet_id, offset, all_events)
            } else {
                read_events(all_events)
            }
        })
}

function read_events(_all_events) {
    Object.entries(_all_events).forEach(item => {
        await new Promise(r => setTimeout(r, 2000));
        $.get(`https://api.etherscan.io/api?module=proxy&action=eth_getTransactionByHash&txhash=${item[1]["transaction"]["transaction_hash"]}&apikey=${etherscan_api_key}`).
            done(function (return_data) { 
                console.log(return_data)
            }) 
    })
}

标签: javascriptnode.jsasync-await

解决方案


你也可以试试这个。

function read_events(_all_events) {
Object.entries(_all_events).forEach(async (item) => {
    await new Promise(r => setTimeout(r, 2000));
    $.get(`https://api.etherscan.io/api?module=proxy&action=eth_getTransactionByHash&txhash=${item[1]["transaction"]["transaction_hash"]}&apikey=${etherscan_api_key}`).
        done(function (return_data) { 
            console.log(return_data)
        }) 
})
}

推荐阅读