5

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

説明のために、これは私が async モジュールをどのように使用しているかです:

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

あなたが私を助けてくれることを願っています、ありがとう!

4

1 に答える 1

12

dataイベント内でコールバック関数を呼び出しています( docs を参照)。これは、データのチャンクが受信されるたびにトリガーされます。つまり、数回です。

Async.parallel は、コールバックがタスクごとに 1 回だけ実行されることを想定しています。

タスクごとに 1 つのコールバックのみを確保するにはend、たとえばイベントにコールバックを配置します。

また、エラー イベントもコールバックを実行する必要があります。

于 2013-03-30T02:10:20.280 に答える