2012-12-20 12 views
5

में setTimeout asynchronously का उपयोग कैसे करें, मैं node.js पर नया हूं, मैंने लंबे समय से कनेक्शन अनुकरण करने के लिए सेटटाइमआउट का उपयोग करने की कोशिश की और उम्मीद है कि यह असीमित रूप से कार्य करेगी।node.js

var http = require('http'); 

http.createServer(function (request, response) { 
    console.log('New request @ ' + request.url); 
    (function (response) { 
     setTimeout(function() { 
      console.log('Time is up'); 
      response.writeHead(200, {"Content-Type": "text/plain"}); 
      response.end('Hello World\n'); 
     }, 3000); 
    })(response); 
}).listen(8124); 

console.log('Server running at http://127.0.0.1:8124/'); 

लेकिन, उपरोक्त कोड एक सिंक्रोनस सिंगल थ्रेड ऐप की तरह प्रदर्शन करता है, जो केवल 3 सेकंड प्रति अनुरोध को संभाल सकता है।

मैंने सोचा कि node.js में सबकुछ अतुल्यकालिक कार्य करना चाहिए। तो, यहाँ क्या समस्या है?

उत्तर

8

SetTimeout async है, आपको मध्य में उस अनाम कार्य की आवश्यकता नहीं है, बस इसे लिखें।

var http = require('http'); 

http.createServer(function (request, response) { 
    console.log('New request @ ' + request.url); 
    setTimeout(function() { 
    console.log('Time is up'); 
    response.writeHead(200, {"Content-Type": "text/plain"}); 
    response.end('Hello World\n'); 
    }, 3000); 
}).listen(8124); 

console.log('Server running at http://127.0.0.1:8124/'); 

आप 10 concurent अनुरोध कुल COMP समय 3sec चारों ओर हो जाएगा, जो यह async है इसका मतलब है उत्पादन है। आप जांचने के लिए एबी टूल का उपयोग कर सकते हैं, या यदि आप प्रोग्राम नोड करते हैं, तो http-perf इंस्टॉल करना आसान हो सकता है। और nperf -c 10 -n 10 http://127.0.0.1:8124

+0

मैंने अब के साथ परीक्षण किया है, और आप सही हैं, setTimeout एक async फ़ंक्शन है। लेकिन, अगर मैं क्रोम में एक ही समय में कई टैब खोलता हूं, तो यह थोड़ा अजीब बात है, यह 5 सेकंड अंतराल के बीच एक-एक करके समाप्त होता है। – Jack

+0

मुझे लगता है कि आप क्रोम में टैब के बीच पर्याप्त तेज़ क्लिक नहीं कर रहे हैं .. :) – balazs

+2

क्रोम एक ही यूआरएल के साथ एक साथ अनुरोध नहीं करेगा। यदि आप यूआरएल में भिन्नता जोड़ते हैं, उदा। पहला टैब अनुरोध करता है http://127.0.0.1:8124/0, दूसरे अनुरोध http://127.0.0.1:8124/1, आदि, तो उन्हें आपकी अपेक्षा की तरह व्यवहार करना चाहिए। Http://stackoverflow.com/questions/15852011/why-settimeout-blocks-eventloop देखें – Jason

1

आपको अपनी नींद को एक नई प्रक्रिया में चलाने की जरूरत है। एक मॉड्यूल है जो आपकी मदद कर सकता है (https://github.com/cramforce/node-worker) या आप स्पॉन के बारे में सामान्य एपीआई दस्तावेज देख सकते हैं।

-3

var async,
__slice = [] .slice;

async = आवश्यकता ("async");

async.setTimeOut = function() {
        वर आर्ग, आर्ग, कॉलबैक, देरी, runWithTimeOut;
        कॉलबैक = तर्क [0], देरी = तर्क [1], तर्क = तर्क [2], args = 4 < = तर्क। लम्बाई? __slice.call (तर्क, 3): [];
        runWithTimeOut = function() {
                वापसी setTimeout (कॉलबैक, देरी, आर्ग, args);
       };

        वापसी async.parallel ([runWithTimeOut]);
};