2016-07-13 8 views
-1

JSの新機能である要求と非同期NPMでの作業に問題があります。非同期と要求、結果を返す

var queries = getURLS(); 

    async.map(queries, function(url, callback) { 
     var options = { 
      url: url, 
      proxy: config.ProxuURL + ":" + config.ProxyPort, 
      headers: { 
       'SwitchProxy': location, 
       'User-Agent': getUA() 
      }, 
      resolveWithFullResponse: true 
     }; 

     request(options, function (err, res, body){ 
      if (!err && res.statusCode === 200) { 
       var urls = []; 

       var $ = cheerio.load(body); 

       $('h3.r a').each(function(i) { 
        urls[i] = getDomain($(this).attr('href')); 
       }); 

       //How do I return urls so I can access it outside of the async loop? 
      } 
     }); 
    }); 

私は(のURL)にconsole.logなら、私は私はそれを解析することができますので、一つのマスターリストにそれらのすべてを集約したい、ドメイン名の10個の配列を受け取ります。

答えて

0

実際にはasync.map()にコールバック関数を追加してそこで結果を探します。さらに、コールバック関数が値を取得するためには、返すデータでコールバックを返す必要があります。

var queries = getURLS(); 

async.map(queries, function(url, callback) { 
    var options = { 
     url: url, 
     proxy: config.ProxuURL + ":" + config.ProxyPort, 
     headers: { 
      'SwitchProxy': location, 
      'User-Agent': getUA() 
     }, 
     resolveWithFullResponse: true 
    }; 

    request(options, function (err, res, body){ 
     if (err) 
      return callback(err, null);   
     if (!err && res.statusCode === 200) { 
      var urls = []; 

      var $ = cheerio.load(body); 

      $('h3.r a').each(function(i) { 
       urls[i] = getDomain($(this).attr('href')); 
      }); 

      // return urls back to async.map() 
      return callback(null, urls); 
     }  
    }); 
}, function(err, results) { 
    if (err) 
     console.log(err); 
    else 
     console.log(results) // Array of all URL Arrays returned from each queries iteration 
}); 
関連する問題