【问题标题】:How to return the array (created by API data) using Node js如何使用 Node js 返回数组(由 API 数据创建)
【发布时间】:2021-06-29 23:46:42
【问题描述】:

我正在使用 node-fetch npm 包通过特定的 API 接收数据。在代码中,我编写了一个 forEach 循环来获取数组中每个元素的 API 响应(在我的示例中,数组是行)。但最后每当我返回数组并打印时,数组显示一个空白结果([])。我是 NodeJS 的新手。请帮我解决这个问题。

我想要的:一个响应数组(dataArr);

async function accessSpreadsheet(cl) {
    
    await doc.useServiceAccountAuth({
      client_email: creds.client_email,
      private_key: creds.private_key,
    });

    await doc.loadInfo();

    const title='Sheet4';
    const rows = await getSheetByTitle(title);
    //const array_size=rows.length;
    //console.log(rows[0].keyword);
    const dataArr=[];

    const obj = new Promise((resolve,reject)=>{
        rows.forEach(async (row) => {
            var data=row.keyword;
            fetch("https://api.url.com/")
            .then(res => res.text())
            .then(function(res) {
                dataArr.push(res);
            })
            .catch(err => console.log(err));
        });
       
        console.log(dataArr);
    });
    // return dataArr;
}

【问题讨论】:

    标签: javascript node.js node-modules


    【解决方案1】:

    您在填充数组之前打印数组的值。 试试这个。

    Promise.all(
      rows.map(row =>
        fetch(row)
          .then(res => res.text())
          .then(res => dataArr.push(res))
      )
    ).then(() => console.log(dataArr));
    

    【讨论】:

    • 您好,Jatin,感谢您的回复。但是在示例中,您已经在 foreach 循环中打印了 dataArr。这意味着它将打印 dataArr total rows.length-1 次。我想要具有所有 API 值的 dataArr 并仅在完成所有 API 调用时打印一次。之后,我想返回该 dataArr (其中包含所有 API 返回值)。我应该如何实施?你能帮帮我吗?
    • @Shushovan 我已经相应地更新了代码,你可以等待 Promise.all() 并返回 dataArr
    【解决方案2】:

    您的代码的主要问题是forEach。每个异步回调函数调用都会返回一个 Promise,但您将它们扔掉而不是等待它们。根据经验,forEach 仅用于同步操作。

    您可以使用 Promise.all([...]) 执行以下操作

    try {
      const dataArr = await Promise.all(rows.map(async row => fetch(<your url>))
    } catch (err) {
      console.error(err)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 2017-05-07
      • 2021-09-28
      • 2023-03-16
      • 2017-07-06
      • 2019-06-02
      • 1970-01-01
      相关资源
      最近更新 更多