javascript - 使用 Node js 从 Web 下载文件并循环
问题描述
我想使用以下代码从网上下载多个文件:
var fs = require('fs');
var http = require('http');
var request = require('request');
var file;
for(var i = 1; i <= 5; i++) {
//CHECK IF REMOTE FILE EXISTS
request('http://webaddress.com/filename' + i + '.jar', function (err, resp) {
//IF EXISTS DO
if (resp.statusCode == 200) {
//DOWNLOAD DATA AND CREATE A NEW .JAR FILE
file = fs.createWriteStream('D:\\filename' + i + '.jar');
http.get('http://webaddress.com/filename' + i + '.jar', function(response) {
response.pipe(file);
file.on('finish', function() {
file.close();
});
});
}
//FILE DOES NOT EXIST
});
}
我想要的结果是:使用文件名filename1-5.jar下载了多个文件。我得到的结果只是一个文件名为 filename5.jar的文件(或循环中 i var 的最后一个值)。我究竟做错了什么?
解决方案
就像@Ionut 说你的请求是异步的,所以你需要等待它
let fs = require('fs');
let request = require('request');
let download = (uri, filename) => {
return new Promise ((resolve, reject) => {
request.head(uri, function(err, res) {
if (res.statusCode === 200) {
request(uri).pipe(fs.createWriteStream(filename)).on('close', resolve);
} else {
reject(res.statusCode);
}
});
});
};
let promises = [];
for(let i = 1; i <= 5; i++) {
promises.push(download('http://webaddress.com/filename' + i + '.jar', 'D:\\filename' + i + '.jar'));
}
Promise.all(promises).then(() => {
process.exit(0);
});
推荐阅读
- node.js - 如何将 Msal 节点令牌缓存存储在数据库中并在应用重新启动时停止清除缓存
- r - 如何为 lmer 公式自动更改随机和固定效果的组合(在 R 中)
- ios - iOS 中的 os_signpost 和 mxSignpost 有什么区别?
- go - Golang 函数默认值
- time - 如何在两个时间点上测试同一组中分类结果比例差异的统计显着性?
- c# - 如何在 AWS 环境中提高 Fetch API 速度?
- reactjs - 有人可以解释 react-native-calendar 议程部分发生了什么吗?
- c++ - 如何在代码编译期间解决与加载共享库相关的错误?
- string - 如何替换颤振或飞镖中的第一个单词
- python - 根据提议的特征对玩家进行分类时存在错误