कुछ भी सही मायने में नोड में समानांतर नहीं है। क्योंकि यह एकल पिरोया हुआ है। हालाँकि, कई ईवेंट्स को शेड्यूल किया जा सकता है और एक क्रम में चलाया जा सकता है जिसे आप पहले से निर्धारित नहीं कर सकते हैं। और डेटाबेस एक्सेस जैसी कुछ चीजें वास्तव में "समानांतर" होती हैं, जिसमें डेटाबेस क्वेरीज़ स्वयं अलग थ्रेड्स में चलाई जाती हैं, लेकिन पूरा होने पर इवेंट स्ट्रीम में पुनः एकीकृत हो जाती हैं।
तो, आप कई ईवेंट हैंडलर्स पर कॉलबैक कैसे शेड्यूल करते हैं? खैर, यह ब्राउज़र साइड जावास्क्रिप्ट में एनिमेशन में उपयोग की जाने वाली एक सामान्य तकनीक है: पूर्णता को ट्रैक करने के लिए एक चर का उपयोग करें।
यह एक हैक की तरह लगता है और यह है, और यह संभावित रूप से गड़बड़ लगता है कि ट्रैकिंग करने के आसपास वैश्विक चर का एक गुच्छा छोड़ने और कम भाषा में यह होगा। लेकिन जावास्क्रिप्ट में हम क्लोजर का उपयोग कर सकते हैं:
function fork (async_calls, shared_callback) {
var counter = async_calls.length;
var callback = function () {
counter --;
if (counter == 0) {
shared_callback()
}
}
for (var i=0;i<async_calls.length;i++) {
async_calls[i](callback);
}
}
fork([A,B,C],D);
ऊपर दिए गए उदाहरण में हम async मानकर कोड को सरल रखते हैं और कॉलबैक फ़ंक्शन को किसी तर्क की आवश्यकता नहीं है। आप तर्क को async फ़ंक्शंस में पास करने के लिए कोड को संशोधित कर सकते हैं और कॉलबैक फ़ंक्शन के परिणाम संचित कर सकते हैं और इसे साझा करने के लिए share_callback फ़ंक्शन पास कर सकते हैं।
अतिरिक्त उत्तर:
वास्तव में, जैसा कि है, वह fork()
फ़ंक्शन पहले से ही एक बंद का उपयोग करके async कार्यों के लिए तर्क पारित कर सकता है:
fork([
function(callback){ A(1,2,callback) },
function(callback){ B(1,callback) },
function(callback){ C(1,2,callback) }
],D);
एकमात्र काम करना बाकी है कि ए, बी, सी से परिणाम जमा करें और उन्हें डी पर पास करें।
और भी अधिक उत्तर:
मैं विरोध नहीं कर सका। नाश्ते के दौरान इस बारे में सोचते रहे। यहां इसका एक कार्यान्वयन fork()
परिणाम जमा करता है (आमतौर पर कॉलबैक फ़ंक्शन के तर्क के रूप में पारित किया जाता है):
function fork (async_calls, shared_callback) {
var counter = async_calls.length;
var all_results = [];
function makeCallback (index) {
return function () {
counter --;
var results = [];
for (var i=0;i<arguments.length;i++) {
results.push(arguments[i]);
}
all_results[index] = results;
if (counter == 0) {
shared_callback(all_results);
}
}
}
for (var i=0;i<async_calls.length;i++) {
async_calls[i](makeCallback(i));
}
}
यह काफी आसान था। यह बनाता हैfork()
काफी सामान्य उद्देश्य और इसका उपयोग कई गैर-सजातीय घटनाओं को सिंक्रनाइज़ करने के लिए किया जा सकता है।
Node.js में उदाहरण उपयोग:
function A (c){ fs.readFile('file1',c) };
function B (c){ fs.readFile('file2',c) };
function C (c){ fs.readFile('file3',c) };
function D (result) {
file1data = result[0][1];
file2data = result[1][1];
file3data = result[2][1];
}
fork([A,B,C],D);
अपडेट करें
यह कोड async.js जैसे पुस्तकालयों के अस्तित्व या विभिन्न वादों पर आधारित पुस्तकालयों के अस्तित्व से पहले लिखा गया था। मुझे विश्वास है कि async.js इससे प्रेरित था, लेकिन मेरे पास इसका कोई सबूत नहीं है। वैसे भी .. अगर आप आज ऐसा करने की सोच रहे हैं तो async.js या वादों पर एक नज़र डालें। बस एक अच्छी व्याख्या / विवरण के ऊपर विचार करें कि कैसे काम करते हैं।
पूर्णता के लिए निम्नलिखित है कि आप इसे कैसे करेंगे async.parallel
:
var async = require('async');
async.parallel([A,B,C],D);
ध्यान दें कि async.parallel
ठीक उसी तरह काम करता है जैसा fork
हमने ऊपर लागू किया था। मुख्य अंतर यह है कि पहले तर्क के रूप में एक त्रुटि पारित होती हैD
और नोड तर्क के अनुसार दूसरे तर्क के रूप में कॉलबैक को पारित करता है।
वादों का उपयोग करते हुए, हम इसे इस प्रकार लिखेंगे:
Promise.all([A,B,C]).then(D);