2012-01-13 11 views
7

मैं उम्मीद कर रहा था कि कोई मेरे लिए यह स्पष्ट कर सकता है। अगर मैं निम्नलिखित कोड Node.js साथ सर्वर साइड चल रहा है, एक ब्राउज़र में नहीं है:जावास्क्रिप्ट एसिंक्रोनस निष्पादन: क्या कॉलबैक चलने वाले कोड को बाधित करेगा?

console.log("a"); 
db.get('select * from table1', function(result){ 
console.log("b"); 
}); 
console.log("c"); 

डेटाबेस कॉल यह मानकर अतुल्यकालिक है मैं परिणाम

a 
c 
b 

लेकिन अगर मैं मिलना चाहिए मेरे कोड

while(1); 

फिर बी कभी निष्पादित नहीं होगा, क्या मैं सही हूँ?

+1

क्या आपने इसे आजमाया? –

+0

क्या आप क्लाइंट या सर्वर जावास्क्रिप्ट के बारे में बात कर रहे हैं? – jfriend00

+0

हम नोड.जेएस के साथ सर्वर पक्ष का मतलब करेंगे लेकिन मुझे लगता है कि यह वही होगा, क्या मुझे गलती है? जावास्क्रिप्ट हमेशा एकल धागा है? – mlihp

उत्तर

5

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

क्लाइंट-साइड जावास्क्रिप्ट एकल थ्रेड किया गया है, इसलिए एक एसिंक्रोनस AJAX कॉल कॉलबैक निष्पादित नहीं किया जाएगा जब तक कि निष्पादन की मुख्य धारा पूरी नहीं हो जाती है और AJAX ईवेंट के लिए जावास्क्रिप्ट निष्पादन की एक नई स्ट्रीम शुरू की जा सकती है जिसके परिणामस्वरूप आपका AJAX कॉलबैक कॉल हो जाएगा समारोह।

this post में सभी घटनाओं को क्रमबद्ध करने के लिए जावास्क्रिप्ट एक ईवेंट कतार का उपयोग कैसे करता है, इसके बारे में आप और अधिक पढ़ सकते हैं।

संपादित

मैं अपने संपादित कि आप सर्वर साइड Node.js, नहीं ब्राउज़र कोड के बारे में बात कर रहे हैं से देखते हैं। डिफ़ॉल्ट रूप से, आपका कॉलबैक किसी नए थ्रेड में नहीं चल रहा है, इसलिए यह db.get() फ़ंक्शन कॉल के हिस्से के रूप में तुरंत निष्पादित होगा या निष्पादन की आपकी वर्तमान स्ट्रीम समाप्त होने तक अधिक संभवतः निष्पादित नहीं होगा और फिर db.get() कॉल भी पूरा हो जाएगा और तो कॉलबैक निष्पादित किया जा सकता है।

node.js कुछ स्थितियों में धागे का उपयोग करता है और आंतरिक रूप से धागे का उपयोग करता है, लेकिन इस तरह की स्थिति में नहीं।

यहां node.js. में थ्रेडिंग पर good article है।

+0

सर्वर-साइड node.js. के लिए प्रासंगिक जानकारी जोड़ा गया – jfriend00

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