2013-03-29 18 views
5

我是node.js中的一个begginer,现在我试图获得一些API的结果。我使用异步模块(https://github.com/caolan/async)并行请求,以便优化。并行API请求的异步模块错误

问题是代码返回错误,在一个不同的API调用

这是每个时间点不同的行(即“回调(ERR,数据)”行)是错误:

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

我使用下面的函数来请求API:

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

为了说明这一点,这就是我如何使用异步模块:

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事件上。

此外,错误事件也应该执行回调。