JavaScript for() 循环在第一次迭代后停止
JavaScript for() loop stops after first iteration
开发人员级别 - Web 开发初学者。熟悉 HTML/CSS/JS 和 NodeJS
程序 - 我有一个视频 URL 数组,这个程序是遍历数组,并逐一下载视频。
问题 - 循环在第一次迭代后停止。 ↓ 这是我的代码 ↓
////////// External Packages ///////////////////
const fs = require('fs');
var request = require('request');
var path = require("path"); ////////////////
/////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
var downloadFile = (uri, filename) => new Promise((resolve, reject) => {
request.head(uri, (err, res, body) => {
console.log('content-type:', res.headers['content-type']);
fileSize = parseInt(res.headers['content-length'], 10);
console.log('content-length:', fileSize);
if (fileSize < 125000000) {
console.log('\n', 'Downloading File');
request(uri)
.on('error', error => {
res.status(502).send(error.message)
reject(error)
})
.pipe(fs.createWriteStream(`${filename}.mp4`))
.on('finish', resolve);
} else {
console.log('File Size Error')
reject;
}
});
})
//////////////
/////////////////////////////////////////////////////////////////////////////
saveVids = async () => {
sources = fs.readFileSync("local-FireStore-Cache-PH.txt");
sources = JSON.parse(sources);
console.log(`Array length : ${sources.length}]`)
for (i = 0; i < sources.length; ++i) {
console.log(`current index : <[${i}]>`);
await downloadFile(`${sources[i].source}`, `${convertToSlug((sources[i]).title)}`);
console.log(`download function complete`)
}
}
saveVids();
RETURNS 以下输出-
Array Length : 27
current index : <[0]>
content-type: video/mp4
content-length: 160860560
File Size Error
并在第一次迭代后停止
这是完整的代码。当 reject
被命中时,代码停止 运行 是正常行为。如果需要继续循环,则需要处理发生错误时如何处理。例如打印错误,仅此而已
const fs = require('fs');
var request = require('request');
var path = require("path");
var downloadFile = (uri, filename) => new Promise((resolve, reject) => {
request.head(uri, (err, res, body) => {
console.log('content-type:', res.headers['content-type']);
fileSize = parseInt(res.headers['content-length'], 10);
console.log('content-length:', fileSize);
if (fileSize < 125000000) {
console.log('\n', 'Downloading File');
request(uri)
.on('error', error => {
res.status(502).send(error.message)
reject(error)
})
.pipe(fs.createWriteStream(`${filename}.mp4`))
.on('finish', resolve);
} else {
// console.log('File Size Error')
reject('File Size Error');
}
});
})
//////////////
/////////////////////////////////////////////////////////////////////////////
saveVids = async () => {
sources = fs.readFileSync("local-FireStore-Cache-PH.txt");
sources = JSON.parse(sources);
console.log(`Array length : ${sources.length}]`)
for (i = 0; i < sources.length; ++i) {
try {
console.log(`current index : <[${i}]>`);
await downloadFile(`${sources[i].source}`, `${convertToSlug((sources[i]).title)}`);
console.log(`download function complete`)
} catch(e) {
console.error(e) // will print the error and continue the next loop
}
}
}
saveVids();
为什么不尝试“break”或“Return False”。我会举一个例子给你一些想法,请看这个并尝试添加到你的代码中
check This jsFiddle
<button onclick="test()">Try it</button>
<p id="demo"></p>
function test(){
let testArray = [1,2,3,4,5,6,7,8,9,10]
for (var i = 0; i < testArray.length > 0; i++) {
console.log(testArray[i])
break; //or return false;
//Otherwise use a condition as follwing -> comment out following code and see
/* if (testArray[i] === 5){
break;
} */
}
}
同步读取文件时,确保将其转换为数组。
sources = fs.readFileSync("local-FireStore-Cache-PH.txt",'utf-8');
sourcesArray = sources.split('\n');
现在可以遍历sourceArray了。
注意:您的文本文件每行必须包含链接。
开发人员级别 - Web 开发初学者。熟悉 HTML/CSS/JS 和 NodeJS
程序 - 我有一个视频 URL 数组,这个程序是遍历数组,并逐一下载视频。
问题 - 循环在第一次迭代后停止。 ↓ 这是我的代码 ↓
////////// External Packages ///////////////////
const fs = require('fs');
var request = require('request');
var path = require("path"); ////////////////
/////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
var downloadFile = (uri, filename) => new Promise((resolve, reject) => {
request.head(uri, (err, res, body) => {
console.log('content-type:', res.headers['content-type']);
fileSize = parseInt(res.headers['content-length'], 10);
console.log('content-length:', fileSize);
if (fileSize < 125000000) {
console.log('\n', 'Downloading File');
request(uri)
.on('error', error => {
res.status(502).send(error.message)
reject(error)
})
.pipe(fs.createWriteStream(`${filename}.mp4`))
.on('finish', resolve);
} else {
console.log('File Size Error')
reject;
}
});
})
//////////////
/////////////////////////////////////////////////////////////////////////////
saveVids = async () => {
sources = fs.readFileSync("local-FireStore-Cache-PH.txt");
sources = JSON.parse(sources);
console.log(`Array length : ${sources.length}]`)
for (i = 0; i < sources.length; ++i) {
console.log(`current index : <[${i}]>`);
await downloadFile(`${sources[i].source}`, `${convertToSlug((sources[i]).title)}`);
console.log(`download function complete`)
}
}
saveVids();
RETURNS 以下输出-
Array Length : 27
current index : <[0]>
content-type: video/mp4
content-length: 160860560
File Size Error
并在第一次迭代后停止
这是完整的代码。当 reject
被命中时,代码停止 运行 是正常行为。如果需要继续循环,则需要处理发生错误时如何处理。例如打印错误,仅此而已
const fs = require('fs');
var request = require('request');
var path = require("path");
var downloadFile = (uri, filename) => new Promise((resolve, reject) => {
request.head(uri, (err, res, body) => {
console.log('content-type:', res.headers['content-type']);
fileSize = parseInt(res.headers['content-length'], 10);
console.log('content-length:', fileSize);
if (fileSize < 125000000) {
console.log('\n', 'Downloading File');
request(uri)
.on('error', error => {
res.status(502).send(error.message)
reject(error)
})
.pipe(fs.createWriteStream(`${filename}.mp4`))
.on('finish', resolve);
} else {
// console.log('File Size Error')
reject('File Size Error');
}
});
})
//////////////
/////////////////////////////////////////////////////////////////////////////
saveVids = async () => {
sources = fs.readFileSync("local-FireStore-Cache-PH.txt");
sources = JSON.parse(sources);
console.log(`Array length : ${sources.length}]`)
for (i = 0; i < sources.length; ++i) {
try {
console.log(`current index : <[${i}]>`);
await downloadFile(`${sources[i].source}`, `${convertToSlug((sources[i]).title)}`);
console.log(`download function complete`)
} catch(e) {
console.error(e) // will print the error and continue the next loop
}
}
}
saveVids();
为什么不尝试“break”或“Return False”。我会举一个例子给你一些想法,请看这个并尝试添加到你的代码中 check This jsFiddle
<button onclick="test()">Try it</button>
<p id="demo"></p>
function test(){
let testArray = [1,2,3,4,5,6,7,8,9,10]
for (var i = 0; i < testArray.length > 0; i++) {
console.log(testArray[i])
break; //or return false;
//Otherwise use a condition as follwing -> comment out following code and see
/* if (testArray[i] === 5){
break;
} */
}
}
同步读取文件时,确保将其转换为数组。
sources = fs.readFileSync("local-FireStore-Cache-PH.txt",'utf-8');
sourcesArray = sources.split('\n');
现在可以遍历sourceArray了。
注意:您的文本文件每行必须包含链接。