2012-06-16 11 views
7

का उपयोग कर मैं एसिंक का उपयोग करने और मॉड्यूल का अनुरोध करने का प्रयास कर रहा हूं लेकिन मुझे समझ में नहीं आता कि कॉलबैक कैसे पास हो जाते हैं। मेरे कोडनोडजेस एसिंक का उपयोग करें और मॉड्यूल

var fetch = function(file, cb) { 
    return request(file, cb); 
}; 

async.map(['file1', 'file2', 'file3'], fetch, function(err, resp, body) { 
    // is this function passed as an argument to _fetch_ 
    // or is it excecuted as a callback at the end of all the request? 
    // if so how do i pass a callback to the _fetch_ function 
    if(!err) console.log(body); 
}); 

मैं क्रम में 3 फ़ाइलें लाने और परिणाम को श्रेणीबद्ध करने के लिए कोशिश कर रहा हूँ है। मेरा सिर कॉलबैक में फंस गया है मैंने कोशिश की और विभिन्न संयोजन जो मैं सोच सकता था। Google बहुत मदद नहीं कर रहा था।

उत्तर

32

अनुरोध एसिंक्रोनस फ़ंक्शन है, यह कुछ नहीं लौटाता है, जब उसका काम पूरा हो जाता है, तो यह वापस कॉल करता है।

var fetch = function(file,cb){ 
    request.get(file, function(err,response,body){ 
      if (err){ 
       cb(err); 
      } else { 
       cb(null, body); // First param indicates error, null=> no error 
      } 
    }); 
} 
async.map(["file1", "file2", "file3"], fetch, function(err, results){ 
    if (err){ 
     // either file1, file2 or file3 has raised an error, so you should not use results and handle the error 
    } else { 
     // results[0] -> "file1" body 
     // results[1] -> "file2" body 
     // results[2] -> "file3" body 
    } 
}); 
+1

कोड काम कर रहा है और बहुत आसान है कि मैं क्या अब गलत किया :) धन्यवाद समझने के लिए – andrei

+0

उदाहरण के लिंक पर किसी भी कॉलबैक नहीं दिखाती है। वे सब कंसोल पर लॉग इन करते हैं। – Catfish

3

अपने उदाहरण में, fetch समारोह तीन बार बुलाया जाएगा, एक बार सरणी async.map को पहले पैरामीटर के रूप में पारित में फ़ाइल नाम से प्रत्येक के लिए: request examples से, आप कुछ की तरह करना चाहिए। एक दूसरा, कॉलबैक पैरामीटर भी fetch में पारित किया जाएगा, लेकिन वह कॉलबैक एसिंक फ्रेमवर्क द्वारा प्रदान किया जाता है और आपको इसे कॉल करना होगा जब आपका fetch फ़ंक्शन ने अपना काम पूरा कर लिया है, जिससे दूसरे कॉलम के रूप में कॉलबैक को इसके परिणाम प्रदान किए जाएंगे। async.map पर तीसरे पैरामीटर के रूप में प्रदान किए जाने वाले कॉलबैक को तब कॉल किया जाएगा जब fetch कॉलों में से सभी ने उन्हें प्रदान की गई कॉलबैक कहा है।

https://github.com/caolan/async#map

तो कोड में अपने विशिष्ट सवाल का जवाब देने देखें, कॉलबैक फ़ंक्शन उपलब्ध कराने तो सभी अनुरोधों के अंत में एक कॉलबैक के रूप में क्रियान्वित किया जाता है। आप इस तरह से कुछ करना चाहते हैं तो आप fetch को एक कॉलबैक पारित करने के लिए की जरूरत है:

async.map([['file1', 'file2', 'file3'], function(value, callback) { 
    fetch(value, <your result processing callback goes here>); 
}, ... 
संबंधित मुद्दे