JavaScript forEach:如何计算 forEach 函数写入的行数?
Posted
技术标签:
【中文标题】JavaScript forEach:如何计算 forEach 函数写入的行数?【英文标题】:JavaScript forEach: How can I count the number of lines written by the forEach function? 【发布时间】:2021-09-08 01:17:27 【问题描述】:目前我的代码是:
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, function (error, 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 中编码)
谢谢, 吉布西尔
【问题讨论】:
【参考方案1】:-
不要在
.forEach
中执行异步代码,这永远不会像您期望的那样工作 - 使用常规 for 循环
使tetProxies
异步
使用await proxytestLogic
摆脱 new Promise
反正你永远也解决不了
所以 - 你最终得到:
async function testProxies(proxies)
let newLined = proxies.replace(/\r|\"/gi, '').split("\n")
for (let index=0; i < newLined.length; index++)
let result = await proxyTestLogic(newLined[index], index);
if (result === 'stop')
break;
)
)
【讨论】:
啊,我太慢了。确切的原因是您调用forEach
处理程序的次数与代理数量一样多。
@AndreyPopov - 在开始下一个迭代之前,你永远不能“等待”每次迭代完成!
我更进一步说,因为我们只是检查传递给index
的proxyTestLogic
,所以没有必要等待它或任何东西。它应该类似于for (let index = 0; index < 150; index++)
...就是这样:)
@AndreyPopov - 不太确定 - 在对 proxyTestLogic
的调用中计算了这些行 - 并且每个行可能不止一个......停止条件是该函数解析为 @ 987654331@ - 编辑:不,等等,是的......我现在明白了,我误解了该函数中的代码(说实话,看起来并不难,因为testProxies
显然是一团糟!!!跨度>
有这条线if (index > 150)
,所以它只是硬编码;)没有计算何时停止 - 它在 150。以上是关于JavaScript forEach:如何计算 forEach 函数写入的行数?的主要内容,如果未能解决你的问题,请参考以下文章
如何在JavaScript中的.forEach()遍历结束之后执行函数
在 Fluid foreach 中填充 Javascript 数组
(JavaScript) 将 forEach 循环与内部回调同步