javascript - 从数组中的链接下载文件

标签 javascript node.js promise

我正在尝试从长度为数千个位置的数组中的链接下载文件。问题是,当我遍历数组时,我在尝试同步文件提取和写入时遇到了困难(超出了最大调用堆栈大小)。我试图创建一个递归函数并尝试使用 promises 但我仍然没有设法找到解决方案。 请帮忙!

到目前为止我的代码:

function download(url, dest, cb) {
    return new Promise(function (resolve, reject) {
        let request = https.get(url, function (response) {
            let file = fs.createWriteStream(dest);
            response.pipe(file);
            file.on('finish', function () {
                console.log('File downloaded')
                resolve(file.close(cb));  
            });
        }).on('error', function (err) { 
            reject(err)
        });
    })

};


function recursiveDownload(links, i) {
    if (i < links.length) {
      download(links[i], './data/' + i + '.csv')
            .then(recursiveDownload(links, ++i))
    } else {
        console.log('ended recursion')
    }
}

recursiveDownload(links, 0)

最佳答案

您可以使用 for 循环来序列化所有 promise 并同步它们。尝试以下操作:

var promise = Promise.resolve();
for(let i = 0; i < links.length; i++){
  promise = promise.then(()=> download(links[i], './data/' + i + '.csv'));
}

或者你甚至可以使用 Array.reduce() 链接你的 promise :

var promise = links.reduce((p, link, index) => p.then(()=>download(link, './data/' + index + '.csv')),Promise.resolve());

关于javascript - 从数组中的链接下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51907951/

相关文章:

node.js - NodeJS 连接 Paradox 数据库

javascript - 处理 promise 链中的错误

javascript - 为什么这个node-mysql插入会产生一个数组?

javascript - 如何更改组合框的选定值?

javascript - 重置 jQuery 轮播中的计时器

javascript - 在不同的事件上应用不同的样式?

node.js - NodeJS : How do I get a correct encrypted result?

javascript - 如何在 Node.js 中调用 var 函数?

node.js - SampleTransaction 类型未定义

javascript - 两次 httpRequest 后解析、saveAll 失败(云代码作业)