2016-09-27 63 views
0

我要處理的第一個項目(「http://www.google.com‘)array2.foreach完成之前開始第二個項目(’http://www.amazon.com」) 但要求是支持線程所以這個結果是節點請求的多線程問題

http://www.google.com 
http://www.amazon.com 
http://www.apple.com 
1 
2 
. 
. 

但我想

http://www.google.com 
1 
2 
3 
. 
. 
http://www.amazon.com 
1 
2 
. 
. 

mycode的

var async = require('async'); 
var request = require('request'); 

var array1 = ['http://www.google.com', 'http://www.amazon.com', 
'http://www.apple.com']; 
var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 

array1.each(function (item, callback) { 

    console.log(item); 
    aa(item, callback) 

}) 

function aa(url) { 

    request(url, function (err, res, html) { 
     array2.forEach(function (item, callback) { 
      //This part Current Page crawling 
      console.log(item); 
      sleep(1000); 
     }); 
    }) 
} 

我該怎麼辦呢?

+0

那麼您是否希望您的所有請求都是非阻塞的?即異步爬取這3個站點? –

回答

0

您已經添加async模塊,但尚未使用。你需要使用它,你可能會喜歡用async.eachSeries()功能來實現您的需要。以下是可能對您有幫助的代碼

var async = require('async'); 
var request = require('request'); 

var array1 = ['http://www.google.com', 'http://www.amazon.com', 
'http://www.apple.com']; 
var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 

function aa(url, callback) { 

    request(url, function (err, res, html) { 
     async.eachSeries(array2, function iteratee(item, callback2) { 
      console.log(item); 
      setTimeout(function() { 
       callback2(null); 
      }, 1000); 
     }, function done() { 
      callback(null) 
     }); 
    }) 
} 

async.eachSeries(array1, function iteratee(item, callback) { 
    console.log(item); 
    aa(item, callback) 
}, function done() { 
    console.log('completed'); 
}); 
+0

非常感謝你 –