我正在尝试从具有数千个位置的数组中的链接下载文件。问题是,当我遍历数组时,尝试同步文件获取和写入时,我碰到了墙(超过了最大调用堆栈大小)。我试图做一个递归函数,并与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)
答案 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))