2016-08-03 10 views
11

मैंने देखा है कि निम्नलिखित कोड में:वादा बनाम setTimeout

setTimeout(function(){console.log('setTimeout')}); 
Promise.resolve(1).then(function(){console.log('promise resolve')}) 

कोई फर्क नहीं पड़ता कि मैं इस कितनी बार निष्पादित, वादा कॉलबैक हमेशा setTimeout से पहले लॉग करता है।

मेरी समझ यह है कि दोनों कॉलबैक अगले टिक पर निष्पादित किए जाने के लिए निर्धारित हैं, और मैं वास्तव में समझ नहीं पा रहा हूं कि क्या चल रहा है, यह वादा हमेशा समय-समय पर सटीकता लेता है।

+3

'वादा' को जल्द से जल्द हल किया जा रहा है, जबकि 'सेटटाइमआउट' बाद में कतार में आता है .. – Rayon

+1

आंतरिक कतार/घटना लूप पर पढ़ें: https://developer.mozilla.org/en -US/डॉक्स/वेब/जावास्क्रिप्ट/इवेंट लूप, http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/ या इसे देखें: https://www.youtube.com/watch? v = 8aGhZQkoFbQ –

उत्तर

4

संक्षिप्त उत्तर वादा घटना लूप स्टैक में सेटटाइमआउट कॉलबैक फ़ंक्शन से बेहतर प्राथमिकता है (या मैं इसे कैसे समझता हूं)।

लंबे उत्तर इस वीडियो को देखते हैं। बहुत उपयोगी। उम्मीद है की यह मदद करेगा।

https://www.youtube.com/watch?v=8aGhZQkoFbQ

+0

अच्छा वीडियो :) धन्यवाद –

0

टाइमआउट और वादे विभिन्न उद्देश्यों की पूर्ति करते हैं।

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

एक वादा कोड को निष्पादित करने की अनुमति देता है जबकि आप पूरा करने के लिए एक और कार्यवाही की प्रतीक्षा करते हैं। आमतौर पर यह एक नेटवर्क कॉल है। तो आपके then() कॉल में कुछ भी नेटवर्क कॉल (या जो भी वादा इंतजार कर रहा है) पूरा हो जाने के बाद निष्पादित किया जाएगा। वादे की शुरुआत और वादे के संकल्प के बीच का समय अंतर पूरी तरह से इस बात पर निर्भर करता है कि वादा क्या निष्पादित कर रहा है, और हर निष्पादन के साथ बदल सकता है।

आपके टाइमआउट से पहले वादा निष्पादित करने का कारण यह है कि वादा वास्तव में कुछ भी इंतजार नहीं कर रहा है, इसलिए इसे तुरंत हल किया गया।

+2

उस तर्क से, इस कोड में: 'Promise.resolve (2) .then (function() {console.log (' वादा समाधान 2 ')}; console.log ('तत्काल') '"वादा समाधान 2" "तत्काल" सही से पहले लॉग किया जाएगा? लेकिन यह – frankies

+3

@frankies नहीं है जिस तरह से वादे कतारबद्ध और हल किए गए तरीके से किया जाता है। मेरे उत्तर का फोकस 'सेटटाइमआउट' और 'वादा' के बीच का अंतर है। – jfadich

9

setTimeout() इसलिए भले ही आप अपने कोड में देरी टाइमआउट अभी भी कम से कम 4ms में विलंब होगा निर्दिष्ट नहीं किया है एक minimum delay of 4ms है। इस दौरान आपके वादे का .then() कहा जाता है।

+0

भले ही कोई 4 एमएमएस थ्रॉटलिंग अनुकूलन न हो, वैसे भी वादे तेज होंगे। चूंकि 'setTimeout' कार्य बनाता है और' वादा 'microtask (नौकरी) बनाता है। यही असली कारण है। – Artin

+1

अच्छा ... ठीक है, लेकिन प्रैक्टिस में 4 एमएमएस न्यूनतम * करता है * इस तरह के उदाहरणों के लिए लागू होता है जैसे मैक्रो बनाम माइक्रो टास्क प्राइरी इसमें प्रवेश नहीं करता है। यदि हम वास्तव में लागू किए गए कार्यों की तुलना में अलग-अलग व्यवहार की कल्पना करने जा रहे हैं, तो अगर समय के मुकाबले वादे की प्राथमिकता कम थी, तो उदाहरण में वादा अभी भी 4 एमएमएस न्यूनतम टाइमआउट के कारण पहले लॉग ऑन होगा। फिर भी, असली दुनिया में वापस यह जानना उपयोगी है कि माइक्रो कार्य अवधारणा जेएस में मौजूद है इसलिए इसका उल्लेख करने के लिए धन्यवाद। – nnnnnn

5

Promise.resolve एक माइक्रोट्रैक शेड्यूल करें और सेटटाइमआउट एक मैक्रोटस्क शेड्यूल करें। और अगले macrotask चलाने से पहले microtasks निष्पादित कर रहे हैं।

+2

यह निकटतम उत्तर है।मैं कार्यों/microtasks के गहरे स्पष्टीकरण के लिए लिंक जोड़ देंगे। https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ – Artin

+1

माइक्रोटॉस्क का स्रोत केवल 2 चीजें हो सकता है: MutationObserver और Promises। – Artin

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