5

मैं समानांतर में दो कार्यों को चलाने के लिए aync.parallel का उपयोग कर रहा हूं। कार्य आरएसएस फ़ीड का अनुरोध करते हैं। फिर आरएसएस फ़ीड को पार्स किया जाता है और मेरे वेब पेज में जोड़ा जाता है।नोड.जेएस async.parallel तब तक इंतजार नहीं करता जब तक कि सभी कार्यों को पूरा नहीं किया जाता है

लेकिन किसी कारण से async.parallel दो कार्य पूर्ण नहीं करने तक

The documentation says:

एक बार कार्य पूरा कर लिया है, परिणाम एक सरणी के रूप में अंतिम कॉलबैक करने के लिए पारित कर रहे हैं इंतजार किए बिना कॉलबैक विधि चलाता है ।

मेरा कोड।

require('async').parallel([ function(callback) { 
     fetchRss(res, bbcOpts); // Needs time to request and parse 
     callback(); 
    }, function(callback) { 
     // Very fast. 
     callback(); 
    } ], function done(err, results) { 
     if (err) { 
      throw err; 
     } 
     res.end("Done!"); 
    }); 

असल में मैंने केवल "हो गया है!" मेरे वेब पेज पर। क्यूं कर?

मुझे res.end() पर कॉल करने की आवश्यकता क्यों है?

Node.JS documentation का कहना है:

विधि, response.end(), प्रत्येक प्रतिक्रिया पर बुलाया जाना चाहिए।

यदि मैं इसे कॉल नहीं करता हूं, तो मेरा वेब पेज "डाउनलोड" किया जा रहा है (मेरा मतलब है कि मेरे ब्राउज़र की पता पंक्ति में प्रगति पट्टी)।

उत्तर

9

मुझे लगता है कि आपका fetchRss फ़ंक्शन एसिंक्रोनस है: बाद में किया जाता है और कॉलबैक तुरंत कॉल किया जाता है। आप fetchRss को कॉलबैक भेजना चाहिए:

function fetchRss(res, bbcOpts, callback) { 
    doSomething(); 
    callback(); 
} 

require('async').parallel([ function(callback) { 
     fetchRss(res, bbcOpts, callback); // Needs time to request and parse 
    }, function(callback) { 
     // Very fast. 
     callback(); 
    } ], function done(err, results) { 
     if (err) { 
      throw err; 
     } 
     res.end("Done!"); 
    }); 

एक तरफ ध्यान दें पर, आप क्रम में res.end() बुलाना चाहिए नोड पता करने के लिए के लिए संदेश पूरा हो गया है और है कि सब कुछ (हेडर + शरीर) में लिखा गया है कि। अन्यथा, सॉकेट खुला रहेगा और एक और संदेश के लिए हमेशा के लिए इंतजार करेगा (यही कारण है कि ब्राउज़र एक प्रगति पट्टी दिखाता है: यह नहीं जानता कि अनुरोध समाप्त हो गया है)।

0

आप async.reflect या async.reflectAll सुनिश्चित करें कि सभी कार्यों http://caolan.github.io/async/docs.html#reflect

पूरा कर रहे हैं बनाने के करने के लिए उपयोग कर सकते हैं
संबंधित मुद्दे

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