从阵列中的链接下载文件

时间:2018-08-18 11:08:37

标签: 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)

2 个答案:

答案 0 :(得分:1)

您可以使用for循环序列化所有诺言并进行同步。请尝试以下操作:

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

或者您甚至可以使用Array.reduce()来兑现您的承诺:

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

答案 1 :(得分:1)

因为您立即致电recursiveDownload,而无需等待下载成功。您实际上想在.then回叫时调用它:

 download(links[i], './data/' + i + '.csv')
        .then(() => recursiveDownload(links, ++i))