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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:43:25