向数组中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
相关产品推荐
相关产品推荐

