问题描述
目前我的代码是:
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
解决方法
- 不要在
Arrays.stream(arr).filter(s -> !s.trim().isEmpty()).forEach(System.out::println);
中执行异步代码,这永远不会像您期望的那样工作 - 使用常规 for 循环 - 使
.forEach
异步 - 使用
tetProxies
- 摆脱你永远无法解决的
await proxytestLogic
所以 - 你最终得到:
new Promise