ошибка с асинхронной readline js в большом текстовом файле - PullRequest
0 голосов
/ 10 марта 2019

У меня есть следующий код, предназначенный для создания файла JSON, содержащего все смайлики, необходимые для проекта, над которым я работаю, с учетом следующего исходного файла https://unicode.org/Public/emoji/11.0/emoji-test.txt

Я запускаю приведенный ниже код как частьсценария сборки gulp.

, но при запуске кода появляется ошибка

Следующие задачи не были выполнены: emojis [12:11:40] Вы забыли сообщить о завершении асинхронного?

это содержимое файла emoji2.json, который я пытаюсь создать

{"emojis":[]}

Не стоит, я не очень знаком с async

const fs = require('fs');
const readline = require('readline');
const gulp = require('gulp');
const json = {};
const emojis = [];
let cat = '';

const parseEmojis = file => {
	const filters = {
		group: '# group:',
		emoji: /[0-9A-Z]{4,5}/g,
		longspace: /\s{2}/g,
		unicode: /\d[0-9abcdef-]{3,99}/g,
		name: /[\w\å][.\-\’\!\:\#\*\(\)\“\”\&éôçãí]*/g,
		sanatize: /(fully-qualified|non-fully-qualified) *#/g
	};

	return new Promise(resolve => {
		const readLines = readline.createInterface({
			input: fs.createReadStream(file),
			crlfDelay: Infinity
		});

		readLines.on('line', line => {
			if (line.indexOf(filters.group) !== -1) {
				cat = line.replace(filters.group, '');
				cat = cat.toLowerCase();
				cat = cat.replace('-&-', '-');
			} else if (line.match(filters.emoji)) {
				const emoji = {};
				let unicode = '';
				let name = '';
				// Sanatize line
				line = line.replace(filters.sanatize, '');
				// Clear deliminators
				line = line.replace(' ;', '');
				line = line.replace('; ', '');
				line = line.replace(';', '');
				// Squash long spaces
				line = line.replace(filters.longspace, '');
				// Concert spaces to dashs
				line = line.replace(/ (?=\w)/g, '-');
				line = line.replace(' ', '-');
				// Make lowercase
				line = line.toLowerCase();

				// Prep for unicode
				line = line.replace('8-ball', '%');
				unicode = line;
				line = line.replace(filters.unicode, '');
				emoji.unicode = unicode.replace(line, '');

				// Undo unicode prep
				line = line.replace('%', '8-ball');

				// Set Char & name
				name = line;
				line = line.replace(filters.name, '');
				emoji.char = line.replace('-', '');
				emoji.name = name.replace(line, '');
				// Save obj
				emojis[cat] = [];
				emojis[cat].push(emoji);
			}

			json.emojis = emojis;
		});
		readLines.on('close', () => {
			resolve();
		});
	});
};

const buildEmojis = async file => {
	await parseEmojis(file);
};

gulp.task('emojis', () => {
  buildEmojis('./emoji.txt').then(() => {
      fs.writeFile('./tests/mock/emojis2.json', JSON.stringify(json), err => {
        if (err) {
          return console.log(err);
        }
      });
    });
});
...