Promise.all()在完成之前停止工作

时间:2020-03-29 20:05:40

标签: javascript node.js es6-promise

我有一个非常简单的脚本,它通过映射大约150条记录的数组来获取一些信息,并且代码似乎可以在较少的记录数下正常工作,但是每次我使用这150条记录运行它时,它就会停止工作,并且不会继续,我认为可能是Promise.all问题。

有什么主意吗?

代码:

const request = require('request');
const axios = require('axios');
const cheerio = require('cheerio');
const fs = require('fs').promises;

let champions = [];

const getChampData = async hrefs => {
  const requests = hrefs.map(async ({ href }) => {
    try {
      const html = await axios.get(href);
      const $ = cheerio.load(html.data);

      const champName = $('.style__Title-sc-14gxj1e-3 span').text();

      let skins = [];

      $('.style__CarouselItemText-sc-1tlyqoa-16').each((_, el) => {
        const skinName = $(el).text();
        skins.push(skinName);
      });

      const champion = {
        champName,
        skins
      };
      console.log(champion);

      return champion;
    } catch (err) {
      console.error(err);
    }
  });

  const results = await Promise.all(requests);

  await fs.writeFile('json/champions-skins.json', JSON.stringify(results));
  return results;
};

编辑#1:

我使用了一个名为p-map的软件包,现在一切正常!

const axios = require('axios');
const pMap = require('p-map');
const cheerio = require('cheerio');
const fs = require('fs').promises;

const getChampData = async hrefs => {
  // const champions = JSON.parse(await fs.readFile('json/champions.json'));

  try {
    let champsList = await pMap(hrefs, async ({ href }) => {
      const { data } = await axios(href);

      const $ = cheerio.load(data);

      const champName = $('.style__Title-sc-14gxj1e-3 span').text();

      let skins = [];

      $('.style__CarouselItemText-sc-1tlyqoa-16').each((_, el) => {
        const skinName = $(el).text();
        skins.push(skinName);
      });

      const champion = {
        champName,
        skins
      };

      console.log(champion);

      return champion;
    });
    await fs.writeFile(
      'champions-with-skins-list.json',
      JSON.stringify(champsList)
    );
  } catch (err) {
    console.error(err.message);
  }
};

1 个答案:

答案 0 :(得分:1)

发生错误时,缺少返回。看起来有些问题,需要提取一些网址。

const getChampData = async hrefs => {
  const requests = hrefs.map(async ({ href }) => {
    try {
      const html = await axios.get(href);
      // rest of the code 
    } catch (err) {
      console.error(err);
      return []
    }
  });

  const results = await Promise.all(requests);

  await fs.writeFile("json/champions-skins.json", JSON.stringify(results));
  return results;
};
相关问题