仅在来自 axios 的请求循环完成后才执行代码块

我有一个脚本可以读取 excel 文件并从特定列获取数据以在我使用 axios 的 Google Maps API 上执行搜索。对于发出的每个请求,我都需要将其保存在newFileList变量中。完成所有请求后,我必须将这个变量的内容保存在一个文件中。newFileList但是,每当我运行我的代码时,文件都会在没有变量内容的情况下被保存。在能够将内容保存在文件中之前,如何等待所有请求完成?


注意:读取、写入和请求数据正在工作。我只需要在所有循环请求完成后才进行救援。我试图通过将循环放在一个 promise 中来解决这个问题,并在我使用的这个循环执行结束时使用resolve.


const xlsx = require("node-xlsx");

const fs = require("fs");

const coordinate = require("./coordinate");


const resourcePath = `${__dirname}/resources`;

const contentFile = xlsx.parse(`${resourcePath}/file-2.xlsx`)[0].data;

const newFile = [[...contentFile, ...["Latitude", "Longitude"]]];


for (let i = 1; i < contentFile.length; i++) {

  const data = contentFile[i];

  const address = data[2];

  coordinate

    .loadCoordinates(address)

    .then((response) => {

      const { lat, lng } = response.data.results[0].geometry.location;

      newFile.push([...data, ...[lat.toString(), lng.toString()]]);

    })

    .catch((err) => {

      console.log(err);

    });

}


console.log(newFile);


//The code below should only be executed when the previous loop ends completely


var buffer = xlsx.build([{ name: "mySheetName", data: newFile }]); // Returns a buffer

fs.writeFile(`${resourcePath}/file-3.xlsx`, buffer, function (err) {

  if (err) {

    return console.log(err);

  }

  console.log("The file was saved!");

});

坐标文件:


const axios = require("axios");


module.exports = {

  loadCoordinates(address) {

    const key = "abc";

    return axios

      .get(`https://maps.googleapis.com/maps/api/geocode/json`, {

        params: {

          address,

          key,

        },

      })

  },

};


梦里花落0921
浏览 236回答 2
2回答

幕布斯7119047

const xlsx = require("node-xlsx");const fs = require("fs");const coordinate = require("./coordinate");const resourcePath = `${__dirname}/resources`;const contentFile = xlsx.parse(`${resourcePath}/file-2.xlsx`)[0].data;const newFile = [[...contentFile, ...["Latitude", "Longitude"]]];(async() => {    try{        for (let i = 1; i < contentFile.length; i++) {          const data = contentFile[i];          const address = data[2];          await coordinate            .loadCoordinates(address)            .then((response) => {              const { lat, lng } = response.data.results[0].geometry.location;              newFile.push([...data, ...[lat.toString(), lng.toString()]]);            })            .catch((err) => {              console.log(err);            });        }        console.log(newFile);        //The code below should only be executed when the previous loop ends completely        var buffer = xlsx.build([{ name: "mySheetName", data: newFile }]); // Returns a buffer        fs.writeFile(`${resourcePath}/file-3.xlsx`, buffer, function (err) {          if (err) {            return console.log(err);          }          console.log("The file was saved!");        });    } catch(e) {        console.log(e)    }})();请注意,我在之前添加了awaitcoordinate.loadCoordinates,以确保在我们继续下一个请求之前完成第一个 axios 请求。

一只名叫tom的猫

您需要使用Promise.all()等待,直到所有承诺都得到解决。之后执行 writeToFile 部分。const requestPromiseArray = [];for (let i = 1; i < contentFile.length; i++) {  const data = contentFile[i];  const address = data[2];  requestPromiseArray.push(coordinate    .loadCoordinates(address))}Promise.all(requestPromiseaArray).then(results=>{     // Handle "results" which contains the resolved values.      // Implement logic to write them onto a file    var buffer = xlsx.build([{ name: "mySheetName", data: results }]);    fs.writeFile(`${resourcePath}/file-3.xlsx`, buffer, function (err) {      if (err) {         return console.log(err);       }     console.log("The file was saved!");});})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript