【问题标题】:JavaScript for() loop stops after first iterationJavaScript for() 循环在第一次迭代后停止
【发布时间】:2021-07-28 10:33:38
【问题描述】:

开发者级别 - 网络开发初学者。熟悉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();

返回以下输出-

Array Length : 27
current index : <[0]>
content-type: video/mp4
content-length: 160860560
File Size Error

并在第一次迭代后停止

【问题讨论】:

  • “文件大小错误”不是表示有错误,因此停止了吗?
  • 如果您希望程序继续运行,请使用 try/catch 包装您的 await downloadFile 方法
  • @VLAZ 没有朋友,这是我 if else 声明中的设计
  • @AvishaManik 好的,如果您确实进入了记录该消息的else,那么您的承诺将永远不会得到解决,因为您只有 reject; 而没有调用它 - 它应该是 @ 987654327@。此外,如果等待的 Promise 被拒绝,则与抛出异常相同 - 执行将终止。
  • @AvishaManik 下面有什么解决方案可以解决您的问题吗?如果是,请接受答案。如果没有,请提供更多信息以便我们为您提供帮助。

标签: javascript node.js asynchronous async-await request


【解决方案1】:

为什么不试试“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;
      } */
  }
}

【讨论】:

    【解决方案2】:

    这是完整的代码。当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();
    

    【讨论】:

      【解决方案3】:

      在同步读取文件时,确保将其转换为数组。

      sources = fs.readFileSync("local-FireStore-Cache-PH.txt",'utf-8');
      sourcesArray = sources.split('\n');
      

      现在你可以遍历sourcesArray了。

      注意:您的文本文件必须每行包含链接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        • 1970-01-01
        • 2015-10-20
        • 2023-03-11
        • 1970-01-01
        相关资源
        最近更新 更多