我正在开发一个用于本地使用的Node应用程序。它以一个CSV文件作为输入,并根据其userId列中的值,每次使用其中一个值向API发出GET请求。我在下面创建了一个虚拟示例。下面是封装在异步函数中的axios请求,它返回一个承诺:
const axios = require("axios");
const utils = require("./utils");
const fs = require("fs").promises;
async function getTitleGivenId(id) {
try {
return await axios.get(`https://jsonplaceholder.typicode.com/posts/${id}`);
} catch (error) {
console.error(error);
}
}
// This works fine
getTitleGivenId(1).then(res => {
console.log(res.data.title);
});为了编写CSV,我想出了这个方法,但是allData字符串不会在map函数中得到更新:
async function saveTitles(inCsv, outCsv) {
try {
const arrOfObj = utils.readCsv(inCsv);
// [
// { userId: '1', color: 'green' },
// { userId: '2', color: 'blue' },
// { userId: '3', color: 'red' }
// ]
let allData = "color,title\n";
arrOfObj.map(o => {
let title;
getTitleGivenId(o["userId"]).then(res => {
title = res.data.title;
allData += `${o["color"]},${title}\n`;
});
});
await fs.writeFile(outCsv, allData);
} catch (err) {
console.error(err);
}
}
// This writes only "color,title" to "outCsv.csv"
saveTitles("./inputCsv.csv", "./outCsv.csv");如能提出任何建议/采取其他办法进行工作,将不胜感激。
发布于 2020-08-02 08:34:51
它会被更新。你不是在等它完成。map()函数被执行,但它不会等待内部承诺完成。因此,一种选择是将映射函数设置为async,然后等待所有迭代完成:
let allData = "color,title\n";
await Promise.all( arrOfObj.map( async (o) => {
const res = await getTitleGivenId(o["userId"])
const title = res.data.title;
allData += `${o["color"]},${title}\n`;
}) );
await fs.writeFile(outCsv, allData);https://stackoverflow.com/questions/63213946
复制相似问题