You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在嵌套的第N层函数中使用await以规避对应语法报错?

报错原因与解决方案

根本原因

  • 你代码中的await用在了forEach的普通回调函数内,且外层的read_events函数没有声明为async,不符合await必须在async函数内使用的语法要求
  • 另外forEach本身不支持异步等待逻辑,即使你给回调加async标记,也会同时触发所有请求,达不到你想要的间隔2秒限流的效果

具体修改方案

步骤1:改造read_events函数

将函数声明为async,把forEach遍历替换为for...of遍历,同时把$.get转为Promise形式用await等待请求完成,确保每次请求+延迟的逻辑按顺序执行。

步骤2(可选):优化start_app逻辑

你原有的递归回调逻辑也可以统一改成async/await写法,代码更易维护。

修改后的完整代码

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

// 改造为async函数,返回Promise
async function start_app(wallet_id, offset, all_events) {
    // 把$.get转为Promise等待返回
    const return_data = await $.get('https://api.opensea.io/api/v1/events', {
        "account_address": wallet_id,
        "only_opensea": "false",
        "event_type": "successful",
        "offset": offset,
        "limit": "50"
    })
    all_events = all_events.concat(return_data['asset_events'])
    offset += return_data['asset_events'].length
    if (return_data['asset_events'].length != 0) {
        // 递归调用也要await
        await start_app(wallet_id, offset, all_events)
    } else {
        // 调用async的read_events要await
        await read_events(all_events)
    }
}

// 声明为async函数
async function read_events(_all_events) {
    // 用for...of代替forEach支持异步等待
    for (const item of Object.entries(_all_events)) {
        // 等待2秒延迟
        await new Promise(r => setTimeout(r, 2000));
        // 等待etherscan请求完成
        const return_data = await $.get(`https://api.etherscan.io/api?module=proxy&action=eth_getTransactionByHash&txhash=${item[1]["transaction"]["transaction_hash"]}&apikey=${etherscan_api_key}`)
        console.log(return_data)
    }
}

如果你不想修改原有start_app的回调逻辑,只单独改造read_events函数,也可以解决报错和实现限流需求。

内容的提问来源于stack exchange,提问作者anelBavari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:18:01