并行API请求的asynchronous模块错误
我是node.js中的一个begginer,现在我正试图获得一些API的结果。 我使用asynchronous模块( https://github.com/caolan/async )来并行请求,因此可以优化。
问题是代码返回一个错误,每次都指向不同的API调用不同的行(“callback(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); }); }
为了说明,这是我如何使用asynchronous模块:
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); });
希望你能帮助我,谢谢!
您正在调用data
事件中的callback函数( 请参阅文档 ),每次接收大量数据时都会触发该函数,这意味着多次。
Async.parallel期望每个任务只执行一次callback。
为了确保每个任务只有一个callback,例如,将callback放在end
事件上。
而且,错误事件也应该执行callback。