2013-03-29 5 views
5

저는 node.js의 초보자입니다. 이제 일부 API 결과를 얻으려고합니다. 비동기 모듈 (https://github.com/caolan/async)을 사용하여 요청을 병렬 처리하므로 최적화 할 수 있습니다.병렬 API 요청시 비동기 모듈 오류가 발생했습니다.

:

문제는 코드가 다른 API 호출의

을에서 다른 라인에 각 시간 점 (이하 "콜백 (ERR, 데이터)"라인)이 오류가 없다는 오류를 반환된다 내가 API 요청하기 위해 다음과 같은 기능을 사용하고

if (called) throw new Error("Callback was already called."); 
         ^
Error: Callback was already called. 

:

function getData(s, apiURL, getURL, callback) { 

    var ht; 
    if (s == 1) { 
     ht = https; 
    } else { 
     ht = http; 
    } 

    var options = { 
     hostname : apiURL, 
     path : getURL, 
     method : 'GET' 
    } 

    var content = ""; 

    ht.get(options, function(res) { 
     console.log("Got response: " + res.statusCode); 

     res.on("data", function(chunk) { 

      content += chunk; 
      //console.log(content); 
      callback(content); 
     }); 

    }).on('error', function(e) { 
     console.log("Error: " + e.message); 
     console.log(e.stack); 
    }); 
} 

는 설명하기 위해이 내가 비동기 모듈을 사용하고 있습니다 방법은 다음과 같습니다

,536,
var sources = sources.split(',') 

    async.parallel({ 
     flickr : function(callback) { 
      if (sources[0] == 1) { 
       getData(0, 'api.flickr.com', 
       "/services/rest/?method=flickr.photos.search&format=json&nojsoncallback=1&api_key=" + config.flickr.appid + "&per_page=5&tags=" + tags, 

       function(data) { 
        callback(null, data); //here that the error may point 
       }); 

      } else { callback(); } 
     }, 
     instagram : function(callback) { 
      if (sources[1] == 1) { 

       getData(1, 'api.instagram.com', 
       "/v1/tags/" + tags.split(',')[0] + "/media/recent?client_id=" + config.instagram, 
       function(data) {       
        callback(null, data); //here that the error may point 

       }); 
      } else { callback(); } 
     } 
    }, function(err, results) {    
      console.log(results); 
     }); 

희망을 보내 주시면 감사하겠습니다.

답변

12

데이터 청크가 수신 될 때마다 트리거되는 data 이벤트 (see the docs)에서 콜백 함수를 호출하고 있습니다. 이는 여러 번 의미가 있음을 의미합니다.

Async.parallel은 각 작업마다 콜백이 한 번만 실행되기를 기대하고 있습니다.

작업 당 하나의 콜백 만 보장하려면 예를 들어 end 이벤트에 콜백을 넣습니다.

또한 오류 이벤트도 콜백을 실행해야합니다.

관련 문제