Выполнить. Затем () обещание NodeJS - PullRequest
1 голос
/ 20 марта 2020

Я пытаюсь выяснить, как вызвать Promise, используя «.then», чтобы я мог продолжить выполнение других функций в ответном выходе Promise. Я подтвердил, что используемая функция работает, как и ожидалось, но после просмотра видео и других примеров SO все еще не получается заставить ее работать. Смотрите ниже фрагмент:

const fs = require('fs');
const JSZip = require('jszip');


const directoryFile = fs.readdirSync('./zipped');
//console.log(directoryFile);

var zip = new JSZip();
var dir = ('./zipped/');


const readZip = async () => {
    const promiseToken = new Promise((resolve, reject) => {
        fs.readFile((dir + directoryFile), function (err, data) {
            if (err) throw err;
            JSZip.loadAsync(data).then(function (zip) {
                const files = Object.keys(zip.files);
                console.log(files);
                files.forEach((files) => {
                    const pkgName = files.substring(files.indexOf("_", files.indexOf("_")) + 1, files.lastIndexOf("_"));
                    const fileExt = files.split('.').pop();
                    const pkgExtract = (pkgName + "." + fileExt);
                });
            })
        });
        return promiseToken;
    });
};


    console.log('Program Starts');

    readZip().then((promiseToken) => {
        console.log(promiseToken.join(','));
    });


    console.log('Program Ends');

Я продолжаю получать "(узел: 1144376) UnhandledPromiseRejectionWarning: ReferenceError: Невозможно получить доступ к 'promitoken' до инициализации". Приведенный выше блок кода принимает массив имен файлов и проходит по каждому элемент и извлекает части имени файла и объединяет части каждого имени элемента, которые мне нужны для создания нового имени файла. Опять же, функция работает и проверена. Что не работает, так это когда я пытаюсь вызвать возвращаемый результат «readZip ()» через «.then ()». Мне нужно, чтобы эта часть работала, чтобы я мог продолжить работу с остальной частью сценария. Я новичок в NodeJS и Javascript, и любая помощь будет оценена, так как ни один из видео или примеров, которые я пытался, кажется, не работает .....

Ответы [ 3 ]

0 голосов
/ 20 марта 2020

Вам необходимо:

  1. вернуть обещание в вашей функции readZip (в настоящее время вы этого не делаете)
  2. разрешить обещание с вашими желаемыми данными (в настоящее время вы не решаете вообще)
  3. Используйте эти данные в .then, например, так:
readZip().then((data) => {
   // Use the data to do whatever you want
});
0 голосов
/ 20 марта 2020

Это может быть намного проще, если вы используете интерфейс fs.promises, где fs.promises.readfile() уже является версией, которая возвращает обещание:

const readZip = async () => {
    const data = await fs.promises.readFile(dir + directoryFile);
    const zip = await JSZip.loadAsync(data);
    const files = Object.keys(zip.files);
    console.log(files);
    return files;
};


readZip.then(files => {
    for (file of files) {
        const pkgName = file.substring(file.indexOf("_", file.indexOf("_")) + 1, file.lastIndexOf("_"));
        const fileExt = file.split('.').pop();
        const pkgExtract = pkgName + "." + fileExt;
        console.log(pkgExtract);
    }
})
0 голосов
/ 20 марта 2020

Вы, похоже, пропустили строку и возвращаете promiseToken из конструктора обещания, а не из определения readZip. Следовательно, readZip ничего не возвращает, и вы получаете значение undefined.

Переместите его в правильное место, и все будет в порядке:

const readZip = async () => {
    const promiseToken = new Promise((resolve, reject) => {
        fs.readFile((dir + directoryFile), function (err, data) {
            if (err) throw err;
            JSZip.loadAsync(data).then(function (zip) {
                const files = Object.keys(zip.files);
                console.log(files);
                files.forEach((files) => {
                    const pkgName = files.substring(files.indexOf("_", files.indexOf("_")) + 1, files.lastIndexOf("_"));
                    const fileExt = files.split('.').pop();
                    const pkgExtract = (pkgName + "." + fileExt);
                });
            })
        });
    });
    return promiseToken; // Moved here
};
...