gpt4 book ai didi

javascript - 使异步调用同步

转载 作者:行者123 更新时间:2023-12-03 08:48:35 25 4
gpt4 key购买 nike

我曾经用 PHP 构建 Web 应用程序,因此养成了同步执行操作的习惯。

我目前正在尝试构建一个网络抓取工具。它的工作原理是

  1. 获取代理列表
  2. 检查代理是否正常工作
  3. 使用代理抓取网络内容。

但是,我意识到大多数调用都是同步的,并且我很难理解 NodeJS 中的异步模块。

这是主要方法。

var proxyChecker = require('proxy-checker');
var request = require('request');
var forEach = require('async-foreach').forEach;
var async = require('async');

var proxiesJar = [];
var goodProxies = [];
var proxyCount = 0;
parseProxiesList(function(error) {
async.each(proxiesJar, checker, function(err, result) {
console.log('Result:' + err);
});
});

获取代理列表

function parseProxiesList(callback) {
console.log("parseProxiesList");
request('http://hidden.com', function (error, response, body) {
if (error) {
console.log("Error [1]");
return callback(error);
}
console.log("Got proxies list");
if (!error && response.statusCode == 200) {
proxies = body.split(/\r?\n/);
var shouldBreak = false;

for (var i = 0; i < proxies.length; i++) {
if (/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,5}/.test(proxies[i])) {
p = proxies[i].split(' ');
var elts = p[0].split(':');
var host = elts[0];
var port = elts[1];
proxiesJar.push(host + ":" + port);
}
}
callback(null, 1);
}
});
}

获取代理列表后,检查代理是否正常工作。

var checker = function(proxy, callback) {
var p = proxy.split(':');
var host = p[0];
var port = p[1];
console.log('[Checking] ' + host + ':' + port);
proxyChecker.checkProxy(host, port, {url: 'http://google.com',regex: /Google/}, function(host, port, ok, statusCode, err) {

if(!ok) {
console.log("Proxy don't work: " + host + ":" + port);
return callback(err);
} else {
console.log("Working proxy: " + host + ":" + port);
goodProxies.push(host + ":" + port);
return callback(null, host + ":" + port);
}
});
};

然而,日志结果是

[Checking] 1.1.1.1:80
[Checking] 2.2.2.2:80
.
.
.
Working proxy: 1.1.1.1:80
Working proxy: 2.2.2.2:80

而不是

[Checking] 1.1.1.1:80
Working proxy: 1.1.1.1:80

[Checking] 2.2.2.2:80
Working proxy: 2.2.2.2:80

最佳答案

async.each 并行执行每个项目的迭代器。

使用async.eachSeries用于同步调用。

关于javascript - 使异步调用同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32774492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com