JavaScript异步函数执行异常:提前输出‘here’问题求助
问题分析与修复方案
你的核心问题是**linkChain函数没有正确返回等待所有异步操作完成的Promise**,导致run里的await无法等待递归的爬虫任务结束,直接执行了后续的console.log("here")。
问题根源
linkChain标记为async函数,但内部没有返回串联所有异步请求和递归操作的Promise。当函数执行到Promise.all(...).then(...)时,没有返回这个Promise链,函数会直接返回一个已resolved的空Promise,run中的await就会提前结束。- 递归调用
linkChain(depth-1, already)时,没有将这个递归的Promise返回给外层的then回调,导致递归的异步任务脱离了等待链。
修复代码
方案一:用then串联Promise链
async function linkChain(depth, already) { if (!depth) { return; } let promises = []; let length = links.length; for (; already < length; already++) { promises.push( axios.get(www + links[already]).then(response => { // 你的response处理逻辑(向links中push新链接) console.log(links.length); }) ); } // 返回Promise.all的Promise,同时在then中返回递归调用的Promise,串联整个异步链 return Promise.all(promises).then(() => { return linkChain(depth - 1, already); }); } async function run () { await linkChain(2, 0); console.log("here"); } run();
方案二:用await简化写法(更易读)
async function linkChain(depth, already) { if (!depth) { return; } let promises = []; let length = links.length; for (; already < length; already++) { promises.push( axios.get(www + links[already]).then(response => { // 你的response处理逻辑 console.log(links.length); }) ); } // 等待当前批次的所有请求完成 await Promise.all(promises); // 递归调用并返回,async函数会自动将返回值包装为Promise return linkChain(depth - 1, already); } async function run () { await linkChain(2, 0); console.log("here"); } run();
修复说明
- 让
linkChain返回完整的Promise链,确保await linkChain(2,0)会等待所有递归层级的异步请求全部完成。 - 递归调用时必须返回
linkChain的调用结果,这样每一层的异步任务都会被串联到顶层的Promise中,run函数才能正确等待所有任务结束。
额外注意
如果links数组接近百万级,无限制的并发请求可能会触发目标网站的反爬机制,或者导致本地网络/内存压力过大。建议添加并发限制(比如手动控制同时运行的Promise数量),避免请求过载。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

