【问题标题】:Axios promises returning array of undefinedAxios 承诺返回未定义的数组
【发布时间】:2021-07-07 01:59:27
【问题描述】:

在处理数据之前,我需要等待一系列 axios 调用(在 for 循环中)完成。所以我将它们添加为一系列承诺,然后使用 Promise.all()

static myFunction(games) {
  let promises = [];    
  games.forEach(game => {
    promises.push(this.getData(game));
  });

  Promise.all(promises)
    .then(gameData => {
    console.log("???? promised:", gameData); //logging as [undefined, undefined, undefined]...
  })
}

static getData(game) {
  return axios({method: "get", url: urlStr})
   .then(res => {
     return parseHTMLData(res);
  }
}

static parseHTMLData(response) {
  return new Promise((resolve, reject) => {

    const $ = cheerio.load(response.data);
    const name = $(this).find('.team_name');
    return resolve(name);

  }
}

我已经确认我在 getData() 中成功取回了数据,但是在 Promise.all() 中它以“未定义”数组的形式返回(当我在上面的代码中记录 gameData 时)。

知道为什么我的 axios 承诺返回未定义吗?

更新:问题是我正在使用 Cheerio 抓取从 Axios 检索到的数据,我需要将 Cheerio 抓取的数据包装在 Promise 中。

【问题讨论】:

  • @jfriend00 我已经简化了我的问题中的示例,但在我的实际代码中,我最后返回了类似 {"team" : "Yankees", "city" : "New York"} 的内容获取数据。我成功地将它控制台记录在那里。但是在 Promise.all 中由于某种原因它显示为未定义
  • 我无法复制。你能做一个minimal reproducible example的可运行代码吗?
  • 您是否尝试过捕获错误响应
  • @akolliy 是的,但承诺没有错误 - 它交付了正确数量的对象,但它们未定义
  • @vikzilla,我试过这个code snippet,我觉得一切都很好......

标签: node.js promise axios cheerio


【解决方案1】:

看看这个JSFiddle。这行得通。可能解析数据有问题,由于没有拒绝,所以得到未定义的结果。

function myFunction(games) {
  let promises = [];    
  games.forEach(game => {
    promises.push(getData(game));
  });
  Promise.all(promises)
    .then(gameData => {
    console.log("? promised:", gameData); //logging as [undefined, undefined, undefined]...
  }).catch(err => console.log(err));
}

function getData(game) {
  return axios({
    method: "post",
    url: "/echo/html/",
    headers: {
      "Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
    },
    data: `html=
<html>
    <body>
    <div class="team">
        <div class="team_name">${game.team_name}</div>
    </div>
  </body>
</html>`
  })
   .then(res => {
     return parseHTMLData(res);
  });
}

function parseHTMLData(response) {
  return new Promise((resolve, reject) => {
    const name = /class="(?:.*?)team_name(?:.*?)"(?:.*?)>(.*?)<\//g.exec(response.data);
    if (name.length > 1)
    {
        return resolve(name[1]);    
    }
    return reject("name not found");
  });
}

let games = [
    { team_name: "TEAM A" },
  { team_name: "TEAM B" },
  { team_name: "TEAM C" }
];

myFunction(games);

【讨论】:

    猜你喜欢
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    相关资源
    最近更新 更多