我是node.js的初学者,现在我正试图获得一些API的结果。我使用异步模块(https://github.com/caolan/async)来并行请求,以便对其进行优化。
问题是代码返回的错误是每次指向不同的API调用中的另一行("回调(错误,数据)"行)
那是错误:
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);
});
希望你能帮助我,谢谢!
答案 0 :(得分:12)
您正在调用data
事件(see the docs)中的回调函数,该事件在每次收到一大块数据时触发,这意味着多次。
Async.parallel期望每个任务只执行一次回调。
要确保每个任务只有一个回调,请将回调放在end
事件上,例如。
此外,错误事件也应该执行回调。