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

向数组中push对象后控制台打印为空数组的问题排查

问题根因
  • axios.get属于异步IO操作,发起请求后不会阻塞后续代码执行,会直接进入下一行逻辑
  • 你调用addData()后,循环里的网络请求还未返回结果时,末尾的console.log(jsonArr)就已经执行完毕,此时then回调里的push操作还没触发,因此打印的是空数组
  • 你在push位置能正常打印返回内容,是因为then回调只会在请求成功返回后才执行,此时数据已经正常返回。
修复方案

可以用async/await结合Promise.all等待所有异步请求完成后,再打印数组内容,修改后的代码如下:

const fs = require("fs");
const XLSX = require("xlsx");
const axios = require('axios');
// 替换成你自己的实际接口密钥
const keys = "你的opencagedata接口密钥";

// Read the file into memory
const workbook = XLSX.readFile("excel.xlsx");

let worksheet = workbook.Sheets[workbook.SheetNames[0]];
// 3683
const jsonArr = [];

async function addData() {
  // 收集所有请求的Promise实例
  const requestList = [];
  for(let i = 2; i < 4; i++) {
    var add = worksheet[`C${i}`].v;
    const request = axios.get('https://api.opencagedata.com/geocode/v1/json', {
      params : {
        q:add,
        key:keys
      }
    })
    .then(function(res) {
      jsonArr.push(res.data.results[2].geometry);
    })
    .catch(function(err) {
      console.log(err);
    })
    requestList.push(request);
  }
  // 等待所有请求执行完毕
  await Promise.all(requestList);
}

// 异步函数执行完毕后再打印数组
addData().then(() => {
  console.log(jsonArr);
});
补充说明
  • 如果你需要对返回结果做后续处理,所有逻辑都要放在addData()执行完成后的回调里,或者放在其他能确保所有异步请求都返回的时机执行
  • 注意原代码里keys变量没有定义,使用前需要替换成你自己的接口密钥

内容的提问来源于stack exchange,提问作者Madhur Joshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 06:12:02