将回调转换为Promise以下载多个文件

时间:2018-05-08 15:23:12

标签: javascript callback promise

我试图从服务器下载多个文件。我与memory leakforforEach遇到了错误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 :(得分:0)

您可以将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)来处理它。