Обеспечение выполнения res.download () выполняется после выполнения другой функции

Я использую Express.js и HTML для этого проекта о получении данных, их обработке и записи в файл, который загружается сразу после нажатия кнопки отправки в форме HTML.

res.download()в ходе почтового вызова выполняется и пытается загрузить файл, который еще не был написан, и я пытаюсь выяснить, как я могу заставить res.download()его выполнить после того, как данные были обработаны и записаны в файл.

Вот код:

let filtered = [], countEv = [];
let createdGTEDate = 0, createdLTEDate = 0;

app.post('/', (req, res) => {
    getData();
    res.download('./filename.txt');
}

getData() {
    module.events.list(
    {
        limit: 100,
        types: ["charges"],
        created: {gte: createdGTEDate, lt: createdLTEDate}
    },
    function (err, events) {
        if(events !== null) {
            for (let i = 0; i < events.data.length; i++) {
                countEv.push(events.data[i]);
            }
            if (events.has_more) {
                recurringPaginate(events["data"][events["data"].length - 1].id);
            }
        }
    });

    function recurringPaginate(starting_after) {
        module.events.list(
            {
                limit: 100,
                created: {gte: createdGTEDate, lt: createdLTEDate},
                types: ["charge.succeeded", "charge.failed"],
                starting_after: starting_after
            },
            function (err, events) {
                for (let i = 0; i < events.data.length; i++) {
                    countEv.push(events.data[i]);
                }
                if (events.has_more) {
                    recurringPaginate(events["data"][events["data"].length - 1].id);
                }
                if(events.has_more === false) {
                    filterCharges();
                }
            });
    }
}

function filterCharges() {
    uniqueCharges = _.uniq(countEv, function (u) {
        return u.data.id;
    });
    pendingCharges = uniqueCharges.filter(function (obj) {
        return obj.data.type === "pending";
    });
    writeCSV();
}

function writeCSV() {
    let writeStream = fs.createWriteStream("Report.csv");
    let writeData = "Start Date, End Date, Pending Charge Count 
" +
        createdGTEDate + ", " + createdLTEDate + ", " + pendingCharges.length + " 
";
    writeStream.write(writeData);
    writeStream.close();
}

Заметки о коде: - Использование Underscore.js для функции uniq ().

Для выполнения выполнения getData()функции требуется некоторое время, так как она должна разбиваться на страницы с большим количеством данных, и каждый раз, когда соответствующая форма HTML отправляется, пост-вызов вызывает res.download()немедленное выполнение и пытается загрузить файл, прежде чем getData()он даже закончил получать данные ,

Любые идеи о том, что было бы хорошим способом гарантировать, что все данные были загружены, обработаны и записаны в файл до этого res.download(), фактически заставляют файл загружаться?

EDIT: Добавлены недостающие фрагменты кода выше. Спасибо всем!

javascript,node.js,express,

0

Ответов: 1


0 принят

Чтобы ответить на мой собственный вопрос здесь, конечно, после намека на обратные вызовы из @information_interchange в комментариях, это было разрешено просто с помощью функции обратного вызова для потока записи при закрытии.

.....
.....
writeStream.write(writeData); //write data to CSV write stream
    writeStream.close();
    writeStream.on("close", function() {  //callback function calls the download function when write stream has been closed
        downloadReport(res);
    })
.....
.....

Спасибо всем за вашу помощь и за любые блуждающие души, которые здесь оказываются, я надеюсь, что все ответы здесь помогут вам!

JavaScript, Node.js, экспресс,
Похожие вопросы