并行API请求的异步模块错误

时间:2013-03-29 23:32:29

标签: javascript node.js asynchronous

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

希望你能帮助我,谢谢!

1 个答案:

答案 0 :(得分:12)

您正在调用data事件(see the docs)中的回调函数,该事件在每次收到一大块数据时触发,这意味着多次。

Async.parallel期望每个任务只执行一次回调。

要确保每个任务只有一个回调,请将回调放在end事件上,例如。

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