2013-03-29 2 views
5

Я начинаю в node.js, и теперь я пытаюсь получить некоторый результат API. Я использую асинхронный модуль (https://github.com/caolan/async) для параллельного запроса, чтобы его можно было оптимизировать.Ошибка модуля Async с параллельными запросами API

Проблема заключается код возвращает ошибку, что каждый раз указывает на другую линию («обратный вызов (эээ, данные)» линии) в другом вызове 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); 
     }); 

Надеюсь, вы можете мне помочь, спасибо!

ответ

12

Вы вызываете функцию обратного вызова внутри события data (see the docs), которое запускается каждый раз, когда принимается кусок данных, что означает несколько раз.

Async.parallel ожидает, что обратный вызов будет выполняться только один раз для каждой задачи.

Чтобы обеспечить только один обратный вызов для каждой задачи, поместите обратный вызов на событие end, например.

Кроме того, событие ошибки также должно выполнить обратный вызов.

Смежные вопросы