2013-08-29 9 views
6

में सेटटाइमआउट का उपयोग क्यों करें, मैंने यह समझने की कोशिश की कि कैसे स्थगित काम करता है, इसलिए उनमें से सभी setTimeout का उपयोग करते हैं। this questions का उपयोग करने वाले सेस्थगित

this.callbacks;// array of functions reference 
this.callbacks.forEach(function(callback){ 
    window.setTimeout(function(){ 
      callback(data); 
    },0); 
}); 

एक उदाहरण setTimeout

resolve: function (data) { 
    this.promise.okCallbacks.forEach(function(callback) { 
     window.setTimeout(function() { 
     callback(data) 
     }, 0); 
    }); 
    }, 

क्या setTimeoutcallback(); से या callback.call();

उत्तर

10

ऐसा करने का कारण जावास्क्रिप्ट थ्रेड को किसी अन्य घटना को ट्रिगर करने का मौका देना है जो कतार में प्रतीक्षा कर रहा है।

जावास्क्रिप्ट एकल-थ्रेडेड है। यदि कोई ईवेंट ट्रिगर होता है, तो यह केवल तब चल सकता है जब वर्तमान में चल रहा कोड समाप्त हो गया हो।

शून्य समय देरी के साथ setTimeout का उपयोग प्रभावी ढंग से जेएस दुभाषिया को बताता है कि callback फ़ंक्शन कॉल एक नए संदर्भ का हिस्सा है और आपका वर्तमान कोड ब्लॉक समाप्त हो गया है। इसका अर्थ यह है कि जेएस callback() पर कॉल करने से पहले यह देखने के लिए अवसर लेगा कि किसी अन्य घटना को संभालने की आवश्यकता है या नहीं।

इस हालांकि तुरंत बुलाया जा रहा से callback() ही देरी हो सकती है, यह आपकी साइट के समग्र प्रदर्शन के लिए अच्छा हो सकता है:

अन्य घटनाओं से संभाला जा करना पड़ सकता है कि घटनाओं और अन्य यूआई चलाता क्लिक शामिल हैं। यदि आप उन्हें निष्पादित करने का मौका नहीं देते हैं, तो यह आपके उपयोगकर्ता इंटरफ़ेस को सुस्त या गैर-उत्तरदायी दिखाई दे सकता है।

2

setTimeout रन से पाश में कार्यों बुला के बाद का समय समाप्त होने के बीच अलग है और जावास्क्रिप्ट प्रक्रिया मुफ्त है।

call का उपयोग कर कॉलबैक तुरंत चलाएगा और बाकी सब कुछ अवरुद्ध करेगा।

+0

लेकिन समय 0 –

+0

@ मोइन 7tl के रूप में सेट किया गया है: असल में टाइमआउट के लिए कम बाध्य है, जो 0 से अधिक है (आईआईआरसी यह लोकप्रिय ब्राउज़रों के लिए 4 एमसीसी की तरह है)। इसलिए 0 का अर्थ है "जैसे ही आप इसे प्राप्त कर सकते हैं"। संभवतः जो लोग शून्य टाइमआउट का उपयोग करते हैं, वे इसके बारे में जानते हैं और इसे उद्देश्य पर करते हैं। – Jon

+1

@ मोइन 7tl - हां, ध्यान दें कि मैंने कहा था कि "समय बीत चुका है" मैंने कहा ** "और" **। – Quentin

2

setTimeout(func,0) तुरंत नहीं कहा जाता है।

बस यह कॉलबैक के साथ एक एसिंक्रोनस फ़ंक्शन अनुकरण करता है।

function asyncFunc(callback) { 
    console.log("step1"); 
    setTimeout(callback,0); 
    console.log("step2"); 
} 

asyncFunc(function() {console.log("async step")}); 
/* output: 
step1 
step2 
async step 
*/ 

https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout

कोड setTimeout() द्वारा निष्पादित, समारोह जिसमें से यह

बुलाया गया था तो यह एक अलग निष्पादन संदर्भ में चलाता है के लिए एक अलग निष्पादन संदर्भ में चलाया जाता है लेकिन इसे निष्पादित करने से पहले, जावास्क्रिप्ट को मौजूदा निष्पादन को समाप्त करना चाहिए क्योंकि एकल-थ्रेड पर जावास्क्रिप्ट चल रहा है।

इससे कोई फ़र्क नहीं पड़ता कि वर्तमान निष्पादन के दौरान कितना समय है, क्योंकि इसे किसी अन्य कार्य को निष्पादित करने से पहले समाप्त होना चाहिए।

यदि आपके पास कार्य के अंत से पहले एक अनंत लूप है, उदाहरण के लिए, आपके कॉलबैक को कभी भी नहीं कहा जा सकता है।

1

setTimeout() निर्दिष्ट समय के बाद एक बार लागू होने के लिए आपको एक फ़ंक्शन पंजीकृत करने की अनुमति देता है।

setTimeout() विंडो ऑब्जेक्ट की विधि निर्दिष्ट संख्या मिलीसेकंड के बाद चलाने के लिए एक फ़ंक्शन शेड्यूल करती है। setTimeout() अनुसूचित फ़ंक्शन के निष्पादन को रद्द करने के लिए clearTimeout() पर एक मान देता है।

यदि आप 0 एमको 0 एमएस के समय के साथ कॉल करते हैं, तो आपके द्वारा निर्दिष्ट फ़ंक्शन को को तुरंत नहीं बुलाया जाता है। इसके बजाए, के बाद किसी भी वर्तमान में लंबित ईवेंट हैंडलर चलने के बाद इसे "जितनी जल्दी हो सके" कतार पर रखा गया है।

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