- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用请求库下载多个文件,我需要将它们一一下载并显示进度条,文件链接存储在一个数组中,该数组将它们传递给一个函数以开始下载
const request = require('request')
const fs = require('fs')
const ProgressBar = require('progress')
async function downloadFiles(links) {
for (let link of links) {
let file = request(link)
file.on('response', (res) => {
var len = parseInt(res.headers['content-length'], 10);
console.log();
bar = new ProgressBar(' Downloading [:bar] :rate/bps :percent :etas', {
complete: '=',
incomplete: ' ',
width: 20,
total: len
});
file.on('data', (chunk) => {
bar.tick(chunk.length);
})
file.on('end', () => {
console.log('\n');
})
})
file.pipe(fs.createWriteStream('./downloads/' + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)))
}
}
let links = ['https://speed.hetzner.de/100MB.bin', 'https://speed.hetzner.de/100MB.bin', 'https://speed.hetzner.de/100MB.bin', 'https://speed.hetzner.de/100MB.bin']
downloadFiles(links)
这就是我到目前为止所得到的,问题是请求是异步的,我尝试使用 async/await 但这样我无法让进度条工作。如何才能让文件一次下载一个,并且还有进度条呢?
最佳答案
基于我对 async.queue
的评论,这就是我要写的方式。您可以调用dl.downloadFiles([])
只要您想要,它就会依次获取您添加到队列中的所有内容。
const request = require('request')
const async = require('async')
const fs = require('fs')
const ProgressBar = require('progress')
class Downloader {
constructor() {
this.q = async.queue(this.singleFile, 1);
// assign a callback
this.q.drain(function() {
console.log('all items have been processed');
});
// assign an error callback
this.q.error(function(err, task) {
console.error('task experienced an error', task);
});
}
downloadFiles(links) {
for (let link of links) {
this.q.push(link);
}
}
singleFile(link, cb) {
let file = request(link);
let bar;
file.on('response', (res) => {
const len = parseInt(res.headers['content-length'], 10);
console.log();
bar = new ProgressBar(' Downloading [:bar] :rate/bps :percent :etas', {
complete: '=',
incomplete: ' ',
width: 20,
total: len
});
file.on('data', (chunk) => {
bar.tick(chunk.length);
})
file.on('end', () => {
console.log('\n');
cb();
})
})
file.pipe(fs.createWriteStream('./downloads/' + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)))
}
}
const dl = new Downloader();
dl.downloadFiles([
'https://speed.hetzner.de/100MB.bin',
'https://speed.hetzner.de/100MB.bin'
]);
关于javascript - Node.js中如何一一下载文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57362319/
我想为我指定的每个类别 ID 检索最新帖子的 mongo 选择器。 这是 forumTopics 集合中对象的示例: { _id: ..., createdTime: [unix ep
我正在尝试一个接一个地运行两个ajax 请求。所以,我可以使用 ajax success() 函数: $.ajax({ ... success: function() {
这是我的 Codepen 链接:resizable event 我正在使用可调整大小的 Jquery UI,一切正常,但现在我希望每个 block 上的可调整大小事件只能一个接一个地激活,如果单击另一
我在 Kotlin 上使用 MongoDB 和 Spring,我希望我的应用程序在启动时填充 MongoDB 集合。 (并在每次启动时清洁它) 我的问题是,如果我正在填充的某些数据有问题,我该如何一一
我有一些元素的列表,我想要一个接一个的 fadeIn 元素,意味着如果第一个元素完成 fadeIn 然后下一个元素 fadeIn 等等,在我给定的代码中我不知道出了什么问题,请帮助我.. HTML A
正如很多地方所说,对于大小为 10000 的输入数据,批量预测整个数据比逐行预测要快得多(在这两种情况下,model.n_jobs=1)。 我知道一对一的解决方案有很多开销。但是在在线服务中,请求是一
我在使用 5 个 div 元素使其响应时遇到了问题。 我有这样的 div 元素: Here Image 1 Here Image 2 Here
我是一名优秀的程序员,十分优秀!