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

Node.js for循环中fetch请求全部在循环结束后执行如何解决

问题解决方案

原因说明

Node.js 事件循环机制中,同步任务执行优先级高于所有异步回调任务。你写的 for 循环属于同步任务,会一次性跑完10次迭代,先输出全部0~9的序号,同时把10个fetch请求全部发出。所有fetch的响应回调都属于异步任务,必须等同步任务队列清空后才会依次执行,所以才会出现序号全输出完、再批量输出响应的情况。

你的代码本身请求发送逻辑是符合预期的,只是回调输出被同步任务堵住了,调整方式如下:

修复代码

const fetchUrl = require("fetch").fetchUrl;

// 封装让出事件循环的工具方法,无额外固定延迟
const yieldEventLoop = () => new Promise(resolve => setImmediate(resolve));

(async () => {
  // 循环变量改用let避免变量提升隐患
  for (let i = 0; i < 10; i++) {
    console.log(i);
    checkbalance(i);
    // 主动让出事件循环控制权,让已返回的请求回调优先执行
    await yieldEventLoop();
  }
})()

function checkbalance(req) {
  const urlCheckBalance = `https://api.etherscan.io/api?module=account&action=balancemulti&address=${req}&tag=latest&apikey=<api key>`;
  fetchUrl(urlCheckBalance, function (error, meta, body) {
    console.log(body.toString());
  });
}

效果说明

调整后每次循环迭代都会主动让出线程,已经收到响应的fetch请求回调就可以在两次循环之间执行输出,就能实现序号和响应内容穿插输出的效果。如果希望穿插的概率更高,也可以把yieldEventLoop替换成1~5ms的sleep等待,兼容性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:24:07