2013-03-29 6 views
5

मैं node.js में एक भिखारी हूं और अब मैं कुछ एपीआई के परिणाम प्राप्त करने की कोशिश कर रहा हूं। मैं अनुरोध के समानांतर करने के लिए async मॉड्यूल (https://github.com/caolan/async) का उपयोग कर रहा हूं ताकि इसे अनुकूलित किया जा सके।समांतर एपीआई अनुरोधों के साथ Async मॉड्यूल त्रुटि

:

समस्या

कोड एक त्रुटि लौट रहा है एक अलग API कॉल

है कि में एक अलग लाइन के लिए हर बार अंक ("कॉलबैक (अरे, डेटा)" लाइन) त्रुटि है

if (called) throw new Error("Callback was already called."); 
         ^
Error: Callback was already called. 

मैं एपीआई अनुरोध करने के लिए निम्नलिखित समारोह का उपयोग कर रहा:

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

आशा है कि आप मेरी मदद कर सकते हैं, धन्यवाद!

उत्तर

12

आप data ईवेंट (see the docs) के अंदर कॉलबैक फ़ंक्शन को कॉल कर रहे हैं, जो प्रत्येक बार डेटा का एक हिस्सा प्राप्त होता है, जिसका अर्थ कई बार होता है।

Async.parallel प्रत्येक कार्य के लिए केवल एक बार कॉलबैक निष्पादित होने की उम्मीद कर रहा है।

प्रति कार्य केवल एक कॉलबैक सुनिश्चित करने के लिए, उदाहरण के लिए end ईवेंट पर कॉलबैक डालें।

इसके अलावा, त्रुटि ईवेंट को भी कॉलबैक निष्पादित करना चाहिए।

संबंधित मुद्दे