2010-01-10 37 views
14

यहां मेरी समस्या है। मेरे पास प्रॉक्सी सर्वर का परीक्षण करने के लिए यह फ़ंक्शन है।मेरा फ़ंक्शन कॉल क्यों सेट किया गया है जिसे सेटटाइमआउट द्वारा तुरंत निर्धारित किया जाना चाहिए?

function crawl() { 
    var oldstatus = document.getElementById('status').innerHTML; 
    document.getElementById('status').innerHTML = oldstatus + "Crawler Started...<br />"; 
    var url = document.getElementById('url').value; 
    var proxys = document.getElementById('proxys').value.replace(/\n/g,','); 

    var proxys = proxys.split(","); 

    for (proxy in proxys) { 
     var proxytimeout = proxy*10000; 
     setTimeout(doRequest(url,proxys[proxy]), proxytimeout); 
    } 
} 

मैं 'doRequest()' समारोह में लेकिन फिर भी setTimeout() फ़ंक्शन तुरंत कहा जाता है के साथ लगभग 10 सेकंड के अंतराल के नाम से जाना चाहते हैं।

किसी भी विचार का स्वागत है, धन्यवाद।

पीएस: यहां तक ​​कि अगर मैं 'proxytimout' के लिए मनमाना मूल्य डालता हूं तो इसका कोई प्रभाव नहीं पड़ता है।

setTimeout(doRequest(url,proxys[proxy]), proxytimeout); 

लेखन doRequest() वास्तव में समारोह बुला रहा है:

उत्तर

13

आप उस रूप में setTimeout के लिए समारोह दे के रूप में, समारोह के बजाय निष्पादित किया जाता है setTimeout को पारित कर दिया। आप इसे काम करने के लिए तीन विकल्प हैं:

setTimeout(doRequest, proxytimeout, url, proxys[proxy]); 

या सिर्फ एक स्ट्रिंग है मूल्यांकन किया जाएगा लिखें::

setTimeout('doRequest('+url+','+proxys[proxy]+')', proxytimeout); 

पहले समारोह, तो समय-समाप्ति और पिछले तर्क के रूप में मानकों दें

तीसरी शैली फ़ंक्शन को कॉल करने वाले अज्ञात फ़ंक्शन को पास करना है। ध्यान दें कि इस मामले में, आप एक बंद लूप में परिवर्तित करने से मूल्यों को रोकने के लिए यह करने के लिए है, इसलिए यह थोड़ा मुश्किल हो जाता है:

(function(u, p, t) { 
    setTimeout(function() { doRequest(u, p); }, t); 
})(url, proxys[proxy], proxytimeout); 

दूसरा प्रारूप एक सा hacky है, लेकिन अगर फिर भी काम करता है तर्क स्केलर मान (तार, इंट आदि) हैं। तीसरा प्रारूप थोड़ा अस्पष्ट है, इसलिए इस मामले में पहला विकल्प स्पष्ट रूप से आपके लिए सबसे अच्छा काम करेगा।

+3

अगर मैं गलत हूं, तो मुझे सही करें, लेकिन चूंकि यह एक लूप के अंदर हो रहा है, तो आपके द्वारा दी गई दूसरी विधि काम नहीं करेगी। 'प्रॉक्सी' का मान बदल जाएगा क्योंकि कोई बंद नहीं किया गया है। – nickf

+0

@nickf: मैं यह कहने वाला था। इसके अलावा, तीसरा विकल्प 'eval बुराई' का उल्लंघन करता है। – SLaks

+0

@nickf, आप सच हैं, मैंने उस बिंदु को अनदेखा किया। मैंने अपना जवाब अपडेट कर लिया है। –

0

यहाँ इस लाइन समस्या है। क्या आप चाहते हैं समारोह में ही पारित करने के लिए है:

setTimeout(doRequest, proxytime, url, proxys[proxy]); 
0

आप setTimeout फ़ंक्शन को गलत समझ रहे हैं।

setTimeout फ़ंक्शन एक फ़ंक्शन लेता है और बाद में इसे निष्पादित करता है।
setTimeout(doRequest(url,proxys[proxy]), proxytimeout) लिखकर, आप doRequest फ़ंक्शन (तत्काल) _calling कर रहे हैं, और परिणाम पास कर रहे हैं (यह मानते हुए कि यह एक और फ़ंक्शन देता है) setTimeout पर।

आप setTimeout को doRequest के पैरामीटर भेजने की जरूरत है इस तरह:

setTimeout(doRequest, proxytimeout, url, proxys[proxy]); 

यह setTimeout पारित करेंगे doRequest समारोह अपने आप में (यह पहली बार फोन करने के बिना), और यह भी मानकों को देने के लिए पारित करेंगे doRequest जब अंततः इसे कॉल करता है।

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

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