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
相关产品推荐
相关产品推荐

