如何在嵌套的第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
相关产品推荐
相关产品推荐

