2014-07-26 5 views
5

पर कॉल नहीं किया गया है मेरे पास एक एसिंक कतार है जिसे मैं दबा रहा हूं जिससे कुछ किया जाएगा। जिस तरह से मैं उन वस्तुओं को उत्पन्न करता हूं जिन्हें मुझे धक्का देना है, कुछ नेस्टेड सूचियों के माध्यम से जाकर डेटा ऑब्जेक्ट बनाते हैं। कतार सबकुछ संसाधित करती है लेकिन किसी कारण से मैं console.log('All done.') के साथ अपने मुख्य कॉलबैक पर नहीं जा सकता। मैंने सबसे अनावश्यक सामान हटा दिए हैं और बस एसिंक सामान छोड़ दिया है। मैं क्या गलत कर रहा हूं? क्या मैं कुछ भूल रहा हूँ?एसिंक क्यूई को धक्का देकर एसिंक लूप को दबाकर मुख्य कॉलबैक

var q = async.queue(function(task, callback) { 
    console.log('hello ' + task); 
    callback(); 
}, 2); 

function A(data) { 
    B(data, function() { 
    // THIS ISN'T getting called. 
    console.log('All done.'); 
    }) 
} 

function B(data, callback1) { 
    var list = [[1,2], [3,4], [5,6]]; 
    async.each(list, function(item, callback1) { 
    async.each(item, function(i, callback2) { 
     doWork(i, function() { 
     console.log('Work done'); 
     }) 
     callback2(); 
    }, 
    // THIS should be called when everything in this each is done. 
    callback1) 
    }) 
} 

function doWork(i, callback3) { 
    q.push(i, callback3); 
} 
+0

प्रश्न को साफ़ करने में सहायता के लिए: आप किस आउटपुट प्राप्त कर रहे हैं? आप क्या उम्मीद कर रहे थे ए और बी कहने वाला कोड कहां है? – hugomg

+0

सभी 'हैलो' + कार्य और 'कार्य पूर्ण' प्रिंटिंग कर रहे हैं। लेकिन केवल मुख्य 'सब किया।' नहीं है। – owenlero

+0

कृपया अपने कोड को फिसल गया है, कम से कम यह वाक्य रचनात्मक रूप से सही है, अन्यथा इसे – soulcheck

उत्तर

1

यहाँ कुछ टिप्पणियों के साथ कोड है कॉलबैक की कॉलबैक बारे में बात कर के रूप में एक सा जटिल है:

function B(data, callback1 //this is what you want to be called) { 
    var list = [[1,2], [3,4], [5,6]]; 

    //async1 
    async.each(list, function(item, callback1 //now callback1 is a function passed to your code by `async.each` not the original callback1) { 
     //async2 
     async.each(item, function(i, callback2) { 
     doWork(i, function() { 
     console.log('Work done'); 
     }) 
     callback2(); 
    }, 
    // THIS is actually called, it's just a different function than you think it is 
    callback1) 
    }) 
} 

समस्या यह है कि आप दोनों B के तर्क और कॉलबैक के लिए एक ही नाम का इस्तेमाल किया है async1 कॉलबैक फ़ंक्शन का तर्क।

तो callback1 अंदर async1 कॉलबैक खाल बाहरी callback1 और वास्तव में आंतरिक async1 कॉलबैक जो नियंत्रण वापस async.each को पारित करने के लिए कार्य करता है।

समाधान सरल है: async1 कॉलबैक पैरामीटर का नाम बदलने, उदाहरण के लिए:

function B(data, callback1) { 
    var list = [[1,2], [3,4], [5,6]]; 
    async.each(list, function(item, async1_callback) { //here lies the rename 
    async.each(item, function(i, callback2) { 
     doWork(i, function() { 
     console.log('Work done'); 
     }) 
     callback2(); 
    }, 
    // this is now called as expected 
    callback1 
    ); 
    // BUT we forgot to call the async1_callback, so let's do it: 
    async1_callback(); 

}; 

वर्क्स अपेक्षा के अनुरूप।

+0

पर समझना वास्तव में मुश्किल है, मुझे विश्वास नहीं है कि मुझे याद आया ... लेकिन दूसरा मुद्दा यह है कि यह पहले 'सभी किए गए' के ​​साथ बाहर आ रहा है - लूप सही होने पर आखिरी बार बाहर आना चाहिए? क्या मैं कुछ और याद कर रहा हूँ? – owenlero

+0

यह अभी भी async1_callback() पर कॉल खो रहा था - अद्यतन की जांच करें। जैसा कि 'ऑल किया गया' पहले मुद्रित किया जा रहा है - यह शायद इसलिए है क्योंकि न तो async.each और न ही कतार ऑपरेशन कॉल प्रक्रिया .next कहीं भी टिकटें और आपका कोड इवेंट लूप पर नहीं पहुंचता है। केवल एक बार प्रिंट करने के लिए - इसे async1 पर अंतिम कॉलबैक के रूप में जोड़ें, async2 नहीं – soulcheck

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