Доступ к переменной извне анонимных функций - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь получить значение переменной jsCss вне foreach и функции readdir. Я не могу понять это. Я попытался вывести ее sh в глобальную переменную, но она все еще возвращала пустой массив, когда я регистрировал массив, в который я нажал. Как бы я go об этом?

let items = [];

fs.readdir('.', (err, files) => {
    const readable = files.filter((el) => /\.vide$/.test(el));
    readable.forEach((script) => {
        let data = fs.readFileSync(script, { encoding: 'utf8' });
        const dom = htmlparser2.parseDOM(data);
        const $ = cheerio.load(dom);
        const CSS = $('Vide')
            .clone()
            .children()
            .remove()
            .end()
            .text();
        const str = css(CSS);
        let jsCss = JSON.parse(str);
        items.push(jsCss);
    })
});
console.log(items)

1 Ответ

0 голосов
/ 04 мая 2020

console.log выполняется раньше, чем items.push(), поэтому вы видите пустой массив

Это должно работать так, как вы ожидаете


let items = [];

fs.readdir('.', (err, files) => {
    const readable = files.filter((el) => /\.vide$/.test(el));
    readable.forEach((script) => {
        let data = fs.readFileSync(script, { encoding: 'utf8' });
        const dom = htmlparser2.parseDOM(data);
        const $ = cheerio.load(dom);
        const CSS = $('Vide')
            .clone()
            .children()
            .remove()
            .end() //again go back to selected element
            .text();
        const str = css(CSS);
        let jsCss = JSON.parse(str);
        items.push(jsCss);
    });
    console.log(items);
});

Также вы можете использовать readdirSync(), чтобы пропустить обратный вызов, как это:

let items = [];
const files = fs.readdirSync('.');
const readable = files.filter((el) => /\.vide$/.test(el));
readable.forEach((script) => {
    let data = fs.readFileSync(script, { encoding: 'utf8' });
    const dom = htmlparser2.parseDOM(data);
    const $ = cheerio.load(dom);
    const CSS = $('Vide')
        .clone()
        .children()
        .remove()
        .end() //again go back to selected element
        .text();
    const str = css(CSS);
    let jsCss = JSON.parse(str);
    items.push(jsCss);
});
console.log(items);
...