Обеспечение выполнения res.download () после выполнения другой функции - PullRequest
0 голосов
/ 03 июня 2018

Я использую 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 \n" +
        createdGTEDate + ", " + createdLTEDate + ", " + pendingCharges.length + " \n";
    writeStream.write(writeData);
    writeStream.close();
}

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

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

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

РЕДАКТИРОВАТЬ: Добавлены недостающие биты кода выше.Спасибо всем!

1 Ответ

0 голосов
/ 07 июля 2018

Чтобы ответить на мой собственный вопрос здесь, конечно же, после подсказки о обратных вызовах от @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);
    })
.....
.....

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...