簡體   English   中英

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();

返回以下輸出-

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”。 我會給你一個例子得到一些想法,請看這個並嘗試添加到你的代碼中檢查這個 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');

現在您可以遍歷 sourcesArray。

注意:您的文本文件必須包含每行的鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM