为何async方法中自定义Promise无法按预期执行?
问题分析与修复
核心问题点
second函数未接收回调参数,调用second(() => {resolve(processData())})时传入的回调不会被执行,导致firstPromise始终处于pending状态,then里的second()无法触发。fs.writeFile是回调式异步API,未被Promise化,processData作为async函数会在文件写入完成前就返回,且回调里的throw err会变成未处理错误,无法被async/await捕获。- 流程逻辑未对齐:预期的「++ → 处理数据+打印successful → ++」顺序,因Promise链未正确串联而无法实现。
修复步骤
- 修正
second的调用逻辑:second仅负责打印,无需传入回调,直接执行后即可触发后续流程。 - Promise化文件写入操作:使用Node.js内置的
fs.promises.writeFile,配合await等待写入完成,保证successful在写入结束后打印,同时让processData的Promise在操作完成后才resolve。 - 理顺Promise执行链:确保前一步操作完成后再执行下一步,严格匹配预期的输出顺序。
修复后的代码
const axios = require('axios'); const fs = require('fs').promises; // 使用Promise版本的fs模块 const second = () => { console.log('++'); }; const processData = async () => { const req = await axios.get('http://localhost:5004/swagger'); const reqJson = JSON.stringify(req.data); await fs.writeFile('newSwagger.json', reqJson); // await等待文件写入完成 console.log('successful'); }; // 主流程:按顺序执行 const main = async () => { second(); await processData(); second(); }; // 捕获可能的错误,避免程序崩溃 main().catch(err => console.error('执行出错:', err));
运行后就能得到预期输出:
++ successful ++
内容的提问来源于stack exchange,提问作者B1sman
相关产品推荐
相关产品推荐

