2015-09-25 3 views
0

Я использовал для создания веб-приложений на PHP, поэтому привычка делать вещи синхронно.Сделать асинхронные вызовы синхронными

В настоящее время я пытаюсь создать веб-скребок. Как это работает

  1. Grab список прокси
  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 
+0

Я думаю, что вы - титул назад. ваш код уже асинхронен. heck весь вопрос имеет это mixxd вверх. –

+0

@KevinB Извините, исправлено. Было очень смущено оба термина. – MrYanDao

+0

, как правило, невозможно сделать синхронный асинхронный код, если не существует отдельного метода, который выполняется синхронно, например readFile vs readFileSync. Тем не менее, вы можете привести код к выполнению последовательно, что и делает ниже ответ peter. –

ответ

1

async.each выполняет итераторы для каждого элемента параллельно.

Использовать async.eachSeries для синхронных вызовов.

0

Вы можете попробовать обещать, создавая обещание получить прокси-сервер, а затем выполнить обещание проверить его.

Вы можете найти больше на обещаниях над here

Пример:

function parseProxiesList() { 
    var deferred = Q.defer() 
    console.log("parseProxiesList"); 
    request('http://hidden.com', function (error, response, body) { 
     if (error) { 
      console.log("Error [1]"); 
      deferred.reject(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); 
       } 
      } 
      deffered.resolve(proxiesJar); 
     } 
     return deffered.promise; 
    }); 
} 

Таким образом, вы создали обещание, чтобы получить список прокси. Аналогично, вы можете сделать это для проверки прокси.

Смежные вопросы