JavaScript forEach:如何计算 forEach 函数写入的行数?

问题描述

目前我的代码是:

var ProxyVerifier = require('proxy-verifier');
const fs = require('fs');
var request = require('request');
const { doesNotMatch } = require('assert');

let config = {
    file: 'socks4_proxies.txt',destFile: 'result.txt'
}

function countFileLines(filePath) {
    return new Promise((resolve,reject) => {
        let lineCount = 0;
        fs.createReadStream(filePath)
            .on("data",(buffer) => {
                let idx = -1;
                lineCount--; // Because the loop will run once for idx=-1
                do {
                    idx = buffer.indexOf(10,idx + 1);
                    lineCount++;
                } while (idx !== -1);
            }).on("end",() => {
                resolve(lineCount);
            }).on("error",reject);
    });
};

function getProxies() {
    return new Promise(function (resolve,reject) {
        request.get('https://api.proxyscrape.com/?request=displayproxies&proxytype=socks4&timeout=2500',function (error,response,body) {
            if (!error && response.statusCode == 200) {
                resolve(body);
                console.log('Proxies pulled!')
            } else {
                console.log(`Oops,ProxyScrape is down! Please try again later / contact me`)
            }
        });
    });
}

async function proxyTestLogic(proxy_list,index) {
    var countLines = await countFileLines('file.txt')
    console.log(index)
    if (index > 150) {
        console.log('Ok good done you can stop Now')
        return 'stop';
    } else {
        var splitProxy = proxy_list.split(':');
        var ipPortArr = [splitProxy[0],Number(splitProxy[1])]
        var proxy = {
            ipAddress: ipPortArr[0],port: ipPortArr[1],protocol: 'socks4'
        };

        ProxyVerifier.testAll(proxy,result) {
            if (error) {
            } else {
                if (result["protocols"]["socks4"]["ok"] == true) {
                    fs.appendFile('file.txt',ipPortArr[0] + ':' + ipPortArr[1] + '\n',(err) => {
                    });
                } else {
                }
            }
        });
    }
}

function testProxies(proxies) {
    return new Promise(function (resolve,reject) {
        let newLined = proxies.replace(/\r|\"/gi,'').split("\n")
        newLined.forEach((item,index) => {
            proxyTestLogic(item,index)
        })
    })
}

async function main() {
    let proxies = await getProxies();
    testProxies(proxies)
}

main();

如您所见,它是一个代理验证器。它使用 forEach 函数计算数组中的每个代理。我试图让它在写入socks4_proxies.txt 的x 行数处停止,当我在其上启用console.log 功能时,它只输出同一行1200 次(列表中的代理数量)。我该如何解决这个问题?

(我还应该提到我在 node.js 中编码)

谢谢, jibSIL

解决方法

  1. 不要在 Arrays.stream(arr).filter(s -> !s.trim().isEmpty()).forEach(System.out::println); 中执行异步代码,这永远不会像您期望的那样工作 - 使用常规 for 循环
  2. 使 .forEach 异步
  3. 使用tetProxies
  4. 摆脱你永远无法解决的await proxytestLogic

所以 - 你最终得到:

new Promise

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...