2012-10-09 5 views
10

इस कोड को जो मैं यूआरएल से छवियों को डाउनलोड करने के लिए उपयोग किया गया है है:Node.js में टाइमआउट सहित http.get छवि डाउनलोड की हो रही बड़ी संख्या

http.get(options, function (res) { 
    res.on('data', function (data) { 
     file.write(data); 
    }).on('end', function() { 
     file.end(); 
     console.log(file_name + ' downloaded '); 
     cb(null, file.path); 
    }).on('error', function (err) { 
     console.log("Got error: " + err.message); 
     cb(err, null); 
    }); 
}); 

मैं कैसे एक टाइमआउट हर अनुरोध के लिए जोड़ सकते हैं ताकि वह उस प्रतिक्रिया की प्रतीक्षा न कर सके जो या तो बड़ा डेटा या उत्तरदायी है?

+2

एक अच्छी योजना की तरह लगता है। आपने क्या प्रयास किया है – lanzz

+1

इसका उपयोग करें: http://nodejs.org/api/http.html#http_request_settimeout_timeout_callback – freakish

+0

लेकिन मुझे प्रतिक्रिया ऑब्जेक्ट के साथ कैसे उपयोग करना चाहिए ??? – user1386776

उत्तर

29

ठीक है, आपकी समस्या के कम से कम दो समाधान हैं। एक आसान एक:

var request = http.get(options, function (res) { 
    // other code goes here 
}); 
request.setTimeout(10000, function() { 
    // handle timeout here 
}); 

लेकिन शायद पर्याप्त लचीला नहीं हो सकता है। अधिक उन्नत एक:

var timeout_wrapper = function(req) { 
    return function() { 
     // do some logging, cleaning, etc. depending on req 
     req.abort(); 
    }; 
}; 

var request = http.get(options, function (res) { 
    res.on('data', function (data) { 
     file.write(data); 
     // reset timeout 
     clearTimeout(timeout); 
     timeout = setTimeout(fn, 10000); 
    }).on('end', function() { 
     // clear timeout 
     clearTimeout(timeout); 
     file.end(); 
     console.log(file_name + ' downloaded '); 
     cb(null, file.path); 
    }).on('error', function (err) { 
     // clear timeout 
     clearTimeout(timeout); 
     console.log("Got error: " + err.message); 
     cb(err, null); 
    }); 
}); 

// generate timeout handler 
var fn = timeout_wrapper(request); 

// set initial timeout 
var timeout = setTimeout(fn, 10000); 
+0

आपको कोड के अपने उन्नत संस्करण में कोई गलती है: प्रारंभिक टाइमआउट सेटिंग 'var timeout = setTimeout (fn, 10000);' 'http.get' कॉलबैक के बाहर होना चाहिए। – zavg

+0

@zavg आप सही हैं, ठीक है। – freakish

+6

पहली विधि की सीमाएं क्या हैं? – Robotbugs

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