Парсер на node.js

Пытаюсь спарсить интернет-магазин, чтобы вытащить оттуда товары. Создаю массив с нужными мне категориями:

const categories = ['kompyutery', 'noutbuki', 'smartfony', 'televizory'];

export default categories;

Далее пытаюсь перебрать этот самый массив, сгенерировать нужную ссылку, спарсить товары:

import categories from './categories.js';
import getData from './citilink.js';

const urlGeneration = (category) => {
  const url = `https://www.citilink.ru/catalog/${category}/?sorting=price_asc&view_type=list`;
  return url;
};

categories.map((item) => {
  getData(urlGeneration(item), item);
});

По итогу получаю введите сюда описание изображения

То есть, программа берет сразу весь массив, сразу все 4 категории подставляет, по итогу что-то записывается, но не в свои файлы, а вперемешку. Как мне сделать, чтобы сначала полностью отрабатывала 1 категория, а уже только потом приступало ко второй и так далее? Сам код парсера:

import cheerio from 'cheerio';
import axios from 'axios';
import chalk from 'chalk';
import { Parser } from 'json2csv';
import fs from 'fs';

let total = 0;
let currentValue = 0;
let page = 1;
const data = [];
const start = performance.now();

const getData = async (url, category) => {
  const baseUrl = 'https://www.citilink.ru';
  console.log(category);
  try {
    const response = await axios.get(url);
    const $ = cheerio.load(response.data);
    const results = $('.product_data__gtm-js');
    total = $('.Subcategory__title-container')
      .find('.Subcategory__count')
      .text()
      .replace(/\D/g, '');

    console.log(chalk.bgCyan('Всего позиций для парсинга:') + ' ' + total);
    console.log(chalk.bgCyan('В очереди на парсинг: ') + ' ' + currentValue);

    results.each(function () {
      const title = $(this)
        .find('a.ProductCardHorizontal__title')
        .text()
        .trim();
      const path = $(this)
        .find('.ProductCardHorizontal__header-block a')
        .attr('href');
      const link = baseUrl + path;
      const price = $(this)
        .find('span.ProductCardHorizontal__price_current-price')
        .text()
        .replace(/\D/g, '');
      data.push({ title, link, price });
    });

    if ($('.PaginationWidget__show-more').length > 0) {
      page += 1;
      currentValue = total - (page - 1) * 48;

      console.log(chalk.bgGreen('Перешел на страницу:') + ' ' + page);
      console.log(chalk.bgGreen('Осталось спарсить:') + ' ' + currentValue);

      const next_page = `https://www.citilink.ru/catalog/${category}/?sorting=price_asc&view_type=list&p=${page}`;

      setTimeout(function () {
        getData(next_page, category);
      }, 3500);
    } else {
      const parser = new Parser();
      const csv = parser.parse(data);

      fs.writeFileSync(`./${category}.csv`, csv);

      const end = performance.now();
      const time = (end - start) / 1000;

      console.log('Execution time: ' + time + ' seconds');
    }
  } catch (error) {
    console.error(error);
  }
};

export default getData;

Ответы (0 шт):