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

Promise.all() stops working before finishing

我有一个非常简单的脚本,它通过映射大约 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);
  }
};

On Error return 缺失。看起来有些问题 url 要获取。

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;
};