2016-07-13 2 views
-1

요청 및 비동기 NPM (JS를 처음 사용하는 경우) 작업에 문제가 있습니다.비동기 및 요청, 결과 반환

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을) I 도메인 이름의 10 개 배열을받을 CONSOLE.LOG 경우, 본인은 그것을 통해 구문 분석 할 수있는 하나 개의 마스터 목록에 그들 모두를 집계합니다.

답변

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 
});