Node.js中如何等待http.get请求返回后再执行后续代码?
Node.js异步API调用返回值undefined的解决方法
问题原因
你的apiCall函数是异步操作:内部使用https.get发起网络请求,这个请求不会阻塞代码执行,函数会直接返回undefined,而API返回的数据要等请求完成后才会通过callback回调函数传递。所以直接用let value = apiCall(...)赋值,肯定拿不到结果。
解决方案
方案1:利用回调函数处理后续逻辑
把赋值给data和调用myWrite的逻辑放到apiCall的回调函数里,这样就能保证在拿到API返回值后再执行后续操作:
// 调整调用方式 apiCall(options, function(obj) { data.value = obj; // 此时obj已经是API返回的解析后数据 myWrite(data); });
同时建议优化apiCall的错误处理,遵循Node.js回调规范(第一个参数传错误,第二个传结果),方便调用时捕获异常:
const https = require('https'); const { appendFile } = require('fs'); function apiCall(options, callback) { https.get(options, function(res) { var body = ""; res.on('data', function(data) { body += data; }); res.on('end', function() { try { let obj = JSON.parse(body); callback(null, obj); // 成功时错误传null,结果传obj } catch (parseErr) { callback(parseErr, null); // JSON解析失败时传错误 } }); res.on('error', function(e) { callback(e, null); // 响应错误时传错误 }); }).on('error', function(e) { callback(e, null); // 请求连接失败时传错误 }); } function myWrite(data) { // 注意:如果data是对象,需要转成字符串才能写入CSV,这里用JSON.stringify示例 appendFile('./output/orm-layer-list.csv', JSON.stringify(data) + '\n', function(err) { if (err) { console.log("The following record had the error: ", err) } }); } // 调用示例 const data = {}; const options = { /* 你的API请求配置 */ }; apiCall(options, function(err, obj) { if (err) { console.log("Error requesting data: ", err.message); return; } data.value = obj; myWrite(data); });
方案2:用Promise + async/await实现同步风格代码
如果觉得回调嵌套不够直观,可以把apiCall封装成Promise,再用async/await让异步代码看起来像同步代码,更符合你想要的过程式写法:
const https = require('https'); const { appendFile } = require('fs').promises; // 直接用fs的Promise版本 // 把apiCall封装成Promise function apiCall(options) { return new Promise((resolve, reject) => { https.get(options, function(res) { var body = ""; res.on('data', function(data) { body += data; }); res.on('end', function() { try { let obj = JSON.parse(body); resolve(obj); // 成功时返回结果 } catch (parseErr) { reject(parseErr); // 解析失败时抛出错误 } }); res.on('error', function(e) { reject(e); // 响应错误时抛出错误 }); }).on('error', function(e) { reject(e); // 请求失败时抛出错误 }); }); } // 把myWrite改成async函数(利用fs.promises的appendFile) async function myWrite(data) { try { await appendFile('./output/orm-layer-list.csv', JSON.stringify(data) + '\n'); } catch (err) { console.log("The following record had the error: ", err); throw err; } } // 过程式的主函数 async function processData() { const data = {}; const options = { /* 你的API请求配置 */ }; try { // 等待API请求完成拿到结果 const value = await apiCall(options); data.value = value; // 等待写入文件完成 await myWrite(data); console.log("数据写入成功"); } catch (err) { console.log("处理失败: ", err.message); } } // 执行主函数 processData();
关键说明
- 异步操作的核心是等待异步任务完成后再执行后续逻辑,不能像同步代码那样直接赋值返回值。
- Promise + async/await是当前Node.js处理异步的主流方式,代码可读性更高,适合复杂的异步流程。
内容的提问来源于stack exchange,提问作者zakariah1
相关产品推荐
相关产品推荐

