首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有axios异步/等待的节点JS :对本地文件的写入响应

带有axios异步/等待的节点JS :对本地文件的写入响应
EN

Stack Overflow用户
提问于 2020-08-02 08:29:18
回答 1查看 735关注 0票数 0

我正在开发一个用于本地使用的Node应用程序。它以一个CSV文件作为输入,并根据其userId列中的值,每次使用其中一个值向API发出GET请求。我在下面创建了一个虚拟示例。下面是封装在异步函数中的axios请求,它返回一个承诺:

代码语言:javascript
复制
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函数中得到更新:

代码语言:javascript
复制
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");

如能提出任何建议/采取其他办法进行工作,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-02 08:34:51

它会被更新。你不是在等它完成。map()函数被执行,但它不会等待内部承诺完成。因此,一种选择是将映射函数设置为async,然后等待所有迭代完成:

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63213946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档