Преобразование обратного вызова в Promise для загрузки нескольких файлов - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь загрузить несколько файлов с сервера. Я столкнулся с ошибкой memory leak с for, forEach и map, поэтому я использую эту функцию обратного вызова, и она работает:

.then(files => {

    const downloadFile = callback => {
        if (files.length > 0) {
            let file = files.shift();

            client.download(`/${file}`, `./${file}`, () => {
                console.log(`Downloaded: ${file}`);
                downloadFile(callback);
            });
        } 
        else {
            callback();
        }
    };

    downloadFile(() => {
        console.log('All done');
    })
})

Я хотел бы преобразовать его в Promise function, но я застрял, я пробовал new Promise((resolve, reject)=>{}) и Promise.all(), но он возвращает только первый файл.

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете использовать map() с вашим массивом files, чтобы получить одно обещание для каждого файла. Затем вы можете позвонить Promise.all(), чтобы узнать, когда они все были загружены.

Поскольку мы ничего не знаем о вашем client.download() методе, мы предполагаем, что он делает то, что должен. Странно, что обратный вызов не принимает параметр с фактическими данными файла.

let promises = files.map(file => {
    return new Promise((resolve, reject) => {
        client.download(`/${file}`, `./${file}`, () => {
            // should this call back have some data or error checking?
            console.log(`Downloaded: ${file}`);
        });
    })
})

Promise.all(promises)
.then(() => console.log("all done"))

Поскольку это происходит внутри другого then(), вы можете просто вернуть Promise.all(promises), чтобы обработать его вниз по течению.

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