как и другие заметили, ваши переменные ingredients
и book
- это функции, которые запрашивают информацию внутри своей области и не возвращают ее наружу. чтобы исправить это, вы должны вернуть значения.
, так как вы работаете с асинхронными вещами, ваши функции должны быть заключены в Promise
для правильной обработки потока.
этот код должны помочь вам:
const fs = require('fs');
const readline = require('readline');
const { Writable } = require('stream');
const fsp = fs.promises;
// ingredients.js
const getIngredients = async () => new Promise((resolve, reject) => {
const instream = fs.createReadStream('ingredients.txt');
const outstream = new Writable();
const rl = readline.createInterface(instream, outstream);
const listIngredients = {};
rl.on('line', line => {
const lower = line.toLowerCase();
listIngredients[lower] = 0;
});
rl.on('error', reject);
rl.on('close', () => resolve(listIngredients));
});
// cookbook.js
const getBookContent = async () => new Promise(async (resolve, reject) => {
try {
const wordRegEx = /\b(\w+)\b/g;
const book = await fsp.readFile('cook-book.txt', 'utf8')
const lower = book.toLowerCase();
return resolve(lower.match(wordRegEx));
} catch (error) {
return reject(error);
}
});
// compare.js
(async () => {
const ingredients = await getIngredients();
const words = await getBookContent();
console.log(ingredients);
console.log(words);
})();
имена функций были изменены для лучшего представления их экземпляров.
я также использовал async
iife для используйте синтаксис async/await
, однако вы все еще можете работать с Promise
s