【问题标题】:Async module error with parallel API requests并行 API 请求的异步模块错误
【发布时间】:2013-03-20 17:35:58
【问题描述】:

我是 node.js 的初学者,现在我正在尝试获取一些 API 的结果。我正在使用异步模块 (https://github.com/caolan/async) 来并行请求,以便对其进行优化。

问题是代码在不同的 API 调用中返回一个每次指向不同行(“callback(err, data)”行)的错误

这就是错误:

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

希望你能帮助我,谢谢!

【问题讨论】:

    标签: javascript node.js asynchronous


    【解决方案1】:

    你在data事件(see the docs)内部调用回调函数,每次接收到一大块数据都会触发,也就是多次。

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-05-13
      • 2015-10-24
      • 2022-01-06
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 2018-07-23
      • 2018-02-18
      • 2012-05-03
      相关资源
      最近更新 更多