我正在尝试从长度为数千个位置的数组中的链接下载文件。问题是,当我遍历数组时,我在尝试同步文件提取和写入时遇到了困难(超出了最大调用堆栈大小)。我试图创建一个递归函数并尝试使用 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/