अगली पंक्ति निष्पादित करने से पहले 5 सेकंड प्रतीक्षा करें


311

नीचे यह फ़ंक्शन काम नहीं करता है जैसे मैं इसे चाहता हूं; एक जेएस नौसिखिया होने के नाते मैं यह पता नहीं लगा सकता कि क्यों।

मुझे यह जाँचने से पहले 5 सेकंड प्रतीक्षा करने की आवश्यकता है कि क्या newStateहै -1

वर्तमान में, यह इंतजार नहीं करता है, यह सिर्फ सीधे जाँच करता है।

function stateChange(newState) {
  setTimeout('', 5000);

  if(newState == -1) {
    alert('VIDEO HAS STOPPED');
  }
}

जवाबों:


323

आपको अपना कोड उस कॉलबैक फ़ंक्शन में रखना होगा जो आप को आपूर्ति करते हैं setTimeout:

function stateChange(newState) {
    setTimeout(function () {
        if (newState == -1) {
            alert('VIDEO HAS STOPPED');
        }
    }, 5000);
}

कोई अन्य कोड तुरंत निष्पादित करेगा।


4
मुख्य समस्या यह है कि कुछ मामलों में (विशेष रूप से परीक्षण) यह बहुत ही अपर्याप्त है। क्या होगा अगर आपको फ़ंक्शन से लौटने से पहले 500ms तक सोने की ज़रूरत है, उदाहरण के लिए एक धीमी async http अनुरोध का अनुकरण करने के लिए ?
ए.ग्रांट

14
यदि "परीक्षण" से आपका मतलब इकाई परीक्षण से है: तो आपके परीक्षण ढांचे में एसिंक्स परीक्षण चलाने का एक तरीका होना चाहिए। यदि आप मैन्युअल परीक्षण का मतलब करते हैं: धीमा अनुरोधों को अनुकरण करने के लिए क्रोम के नेटवर्क टैब में थ्रॉटलिंग ड्रॉपडाउन है।
जोसेफ सिलबर

1
क्या होगा यदि मैं एक क्रोम एक्सटेंशन विकसित करता हूं और इंजेक्शन वाले स्क्रिप्ट में अंतिम मूल्यांकन मूल्य मुझे परिणाम देना चाहिए; और मुझे कुछ देरी की आवश्यकता है?
मिरेक

182

आपको वास्तव में ऐसा नहीं करना चाहिए , टाइमआउट का सही उपयोग ओपी की समस्या और किसी अन्य अवसर के लिए सही उपकरण है जहां आप कुछ समय के बाद कुछ चलाना चाहते हैं। जोसेफ सिलबर ने अपने जवाब में उस प्रदर्शन को अच्छी तरह से प्रदर्शित किया है। हालांकि, अगर कुछ गैर-उत्पादन के मामले में आप वास्तव में कुछ समय के लिए मुख्य धागे को लटका देना चाहते हैं, तो यह ऐसा करेगा।

function wait(ms){
   var start = new Date().getTime();
   var end = start;
   while(end < start + ms) {
     end = new Date().getTime();
  }
}

फार्म में निष्पादन के साथ:

console.log('before');
wait(7000);  //7 seconds in milliseconds
console.log('after');

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


7
यह जावास्क्रिप्ट निष्पादित करना बंद नहीं करेगा।
टेरी लिन

23
@TerryLin इसे चलाने का प्रयास करें।
माइक्रो

6
तो मूल रूप से आप CPU समय बर्बाद कर रहे हैं। यह प्रतीक्षा नहीं है क्योंकि आप थ्रेड को स्लीप मोड में नहीं डाल रहे हैं जिससे मुख्य प्रोसेसर अन्य कार्यों में ध्यान केंद्रित कर सके।
Kyordhel

6
@Gzork थ्रेड नींद एक प्रतीक्षा फ़ंक्शन को लागू करने का केवल एक तरीका है, और यह दुर्भाग्य से क्लाइंट-साइड जस्स्क्रिप्ट के संदर्भ में उपलब्ध नहीं है। हालाँकि, यदि आप सोच रहे हैं कि क्लाइंट के अन्य अतुल्यकालिक कार्यों को पूरा करते समय यह पूरा हो जाएगा, तो आपने स्पष्ट रूप से इसका परीक्षण नहीं किया है। हालांकि मैं इसे मुख्य धागे में उपयोग करूंगा, लेकिन मैंने एक फिडेल को यह कहते हुए दर्शाया कि यह पहली बार में सेटटाइमआउट के माध्यम से कैसे बुलाया जाता है, यह अभी भी अन्य async घटनाओं को बाधित करता है jsfiddle.net/souv51v3/1 - आप भी मिल जाएगा JSFiddle विंडो अपने आप ही अप्रतिसादी हो जाती है जबकि यह पूरी हो जाती है।
माइक

1
भयानक समाधान IMHO - "सोते हुए" सीपीयू को हॉग करता है। सोने का सही तरीका async / wait ala के माध्यम से होता है यह उत्तर stackoverflow.com/questions/951021/… या एटिएन का है।
डेविड सिमिक

162

यहां नए एसिंक्स / वेट सिंटैक्स का उपयोग करके समाधान किया गया है ।

ब्राउज़र समर्थन की जांच करना सुनिश्चित करें क्योंकि यह ECMAScript 6 के साथ पेश की गई एक नई सुविधा है।

उपयोगिता समारोह:

const delay = ms => new Promise(res => setTimeout(res, ms));

उपयोग:

const yourFunction = async () => {
  await delay(5000);
  console.log("Waited 5s");

  await delay(5000);
  console.log("Waited an additional 5s");
};

इस दृष्टिकोण का लाभ यह है कि यह आपके कोड को दिखता है और तुल्यकालिक कोड की तरह व्यवहार करता है।


ECMAScript 6 की आवश्यकता नहीं है: यदि आप पहले से ही एसिंक्स लोड करने के लिए वादों का उपयोग कर रहे हैं और श्रृंखला के एक हिस्से की नकल करना चाहते हैं, तो आप इस प्रतीक्षा () फ़ंक्शन को श्रृंखला में जोड़ सकते हैं।
दोव हेफेट्ज

2
यह वास्तव में नए वाक्यविन्यास के साथ सबसे अच्छा जवाब है। मेरे पास उपरोक्त प्रतीक्षा () समाधान का उपयोग करने के मुद्दे थे।
pianoman102

37

इस तरह एक देरी समारोह का उपयोग करें:

var delay = ( function() {
    var timer = 0;
    return function(callback, ms) {
        clearTimeout (timer);
        timer = setTimeout(callback, ms);
    };
})();

उपयोग:

delay(function(){
    // do stuff
}, 5000 ); // end delay

क्रेडिट: जब तक उपयोगकर्ता टाइप करना बंद नहीं करता है .keyup () हैंडलर में देरी कैसे करें?


36

आपको केवल जावास्क्रिप्ट में 5 सेकंड रोकने की कोशिश नहीं करनी चाहिए। यह उस तरह से काम नहीं करता है। आप अब से 5 सेकंड चलाने के लिए कोड के एक फ़ंक्शन को शेड्यूल कर सकते हैं, लेकिन आपको उस कोड को डालना होगा जिसे आप बाद में किसी फ़ंक्शन में चलाना चाहते हैं और उस फ़ंक्शन के बाद आपके बाकी कोड तुरंत चलाना जारी रखेंगे।

उदाहरण के लिए:

function stateChange(newState) {
    setTimeout(function(){
        if(newState == -1){alert('VIDEO HAS STOPPED');}
    }, 5000);
}

लेकिन, अगर आपके पास इस तरह का कोड है:

stateChange(-1);
console.log("Hello");

console.log()बयान तुरन्त चलेगी। यह stateChange()फ़ंक्शन में टाइमआउट की आग के बाद तक इंतजार नहीं करेगा । आप समय की पूर्व निर्धारित राशि के लिए जावास्क्रिप्ट निष्पादन को रोक नहीं सकते।

इसके बजाय, कोई भी कोड जिसे आप विलंब से चलाना चाहते हैं, setTimeout()कॉलबैक फ़ंक्शन (या उस फ़ंक्शन से कॉल किया गया) के अंदर होना चाहिए ।

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


31
आप समय की पूर्व निर्धारित राशि के लिए जावास्क्रिप्ट निष्पादन को रोक नहीं सकते । मुझे लगता है कि आपको मतलब नहीं होना चाहिए, क्योंकि आप कर सकते हैं (यदि आप खुद को फांसी देना चाहते हैं):var t = new Date().getTime(); while (new Date().getTime() < t + millisecondsToLockupBrowser);
जोसेफ सिलबर

9
@JosephSilber - ठीक है, आप ऐसा कर सकते हैं, लेकिन व्यवहार में है कि कई ब्राउज़रों के रूप में काम नहीं करता है, यह कहते हुए कि एक स्क्रिप्ट अनुत्तरदायी हो गई है और यह एक भयानक उपयोगकर्ता अनुभव है और यह बैटरी जीवन और पृष्ठ के लिए बुरा है। ऐसा करते हुए लटका दिया और ... यह बुरा होगा।
१०

12
ठीक है कि भयानक होगा, और कोई भी कभी भी कभी भी कभी भी ऐसा करना चाहिए। मैं बस अपने भीतर के "अच्छी तरह से" का विरोध नहीं कर सका । माफ़ करना।
जोसफ सिलबर

31

यदि आप एक async फ़ंक्शन में हैं, तो आप इसे केवल एक पंक्ति में कर सकते हैं:

console.log(1);
await new Promise(resolve => setTimeout(resolve, 3000)); // 3 sec
console.log(2);

ध्यान दें , यदि लक्ष्य NodeJS है, तो इसका उपयोग करना अधिक कुशल होगा (यह एक पूर्वनिर्धारित रूप से निर्धारित सेटटाइमआउट फ़ंक्शन है):

await setTimeout[Object.getOwnPropertySymbols(setTimeout)[0]](3000) // 3 sec

दो कार्यान्वयन के बीच क्या अंतर है?
ईजेवेदो

1
वर्तमान में, कोई अंतर नहीं है। लेकिन अगर कुछ बिंदु पर नोड इसे तेज / सुरक्षित / अधिक कुशल बनाने का फैसला करेगा, तो आप नोड जेएस संस्करण अपफ्रंट का उपयोग करेंगे। हालाँकि अधिकांश लोगों के लिए पठनीयता प्रमुख कारक होने की संभावना है, इस मामले में आप पहले तरीके का बेहतर उपयोग करते हैं।
SHL

धन्यवाद। आपके उत्तर ने एक समस्या को हल कर दिया है जिसका मैं पहले से ही तीन दिनों से सामना कर रहा हूँ। धन्यवाद।
ईजेवेदो

8

इसे इस्तेमाल करे:

//the code will execute in 1 3 5 7 9 seconds later
function exec() {
    for(var i=0;i<5;i++) {
        setTimeout(function() {
            console.log(new Date());   //It's you code
        },(i+i+1)*1000);
    }
}

7

मिलि सेकंड में प्रतीक्षा के लिए इस तरह से एक फ़ंक्शन बनाने का सबसे अच्छा तरीका, यह फ़ंक्शन तर्क में प्रदान किए गए मिलीसेकंड के लिए इंतजार करेगा:

function waitSeconds(iMilliSeconds) {
    var counter= 0
        , start = new Date().getTime()
        , end = 0;
    while (counter < iMilliSeconds) {
        end = new Date().getTime();
        counter = end - start;
    }
}


3

जोसेफ सिल्बर के जवाब के आधार पर , मैं इसे थोड़ा और सामान्य करूंगा।

आपका कार्य होगा (आइए प्रश्न के आधार पर एक बनाएं):

function videoStopped(newState){
   if (newState == -1) {
       alert('VIDEO HAS STOPPED');
   }
}

और आप एक प्रतीक्षा समारोह हो सकता है:

function wait(milliseconds, foo, arg){
    setTimeout(function () {
        foo(arg); // will be executed after the specified time
    }, milliseconds);
}

अंत में आपके पास होगा:

wait(5000, videoStopped, newState);

यह एक समाधान है, मैं प्रतीक्षा फ़ंक्शन (केवल के foo();बजाय करने के लिए foo(arg);) में तर्कों का उपयोग नहीं करूंगा, लेकिन यह उदाहरण के लिए है।


3

यह समाधान एक ताज़ा नियंत्रण के लिए रिएक्ट नेटिव के प्रलेखन से आता है :

function wait(timeout) {
    return new Promise(resolve => {
        setTimeout(resolve, timeout);
    });
}

ओपी के प्रश्न पर इसे लागू करने के लिए, आप इस फ़ंक्शन का उपयोग समन्वय के साथ कर सकते हैं await:

await wait(5000);
if (newState == -1) {
    alert('Done');
}

1

आप अपने फ़ंक्शन (async और प्रतीक्षा) में छोटे परिवर्तन करके विलंब जोड़ सकते हैं।

const add5SecondsDelay = () => {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('5 seconds');
    }, 50000);
  });
}

async function asyncFunctionCall() {

  console.log("stpe-1"); 
  const result = await add5SecondsDelay ();
  console.log("step-2 after 5 seconds delay"); 

}

asyncFunctionCall();


-2

नया Js फ़ंक्शन बनाएँ

function sleep(delay) {
        var start = new Date().getTime();
        while (new Date().getTime() < start + delay);
      }

फ़ंक्शन को कॉल करें जब आप निष्पादन में देरी करना चाहते हैं। देरी मूल्य के लिए int में मिलीसेकंड का उपयोग करें।

####Some code
 sleep(1000);
####Next line

3
यह बहुत अधिक संसाधनों का उपभोग करेगा।
अवनि

-2

मैंने इसका इस्तेमाल एज या IE से पीसी गेम्स चलाने के लिए किया। और यह 7 सेकंड के बाद IE एज को सेल्फक्लोज करता है।

इस तरह से गेम शुरू करने के लिए फायरफॉक्स और गूगल क्रोम कैंट का इस्तेमाल किया जा सकता है।

<html<body>
<a href="E:\game\game.exe" name="game" onmouseout="waitclose(7000);"> game
<img src="game.jpg" width="100%" height="97%" ></a>
<script>
function waitclose(ms){
 var start = new Date().getTime();var end=start;
 while(end < start + ms) {end = new Date().getTime();}
window.open('', '_self', ''); window.close();
}
</script>
</body></html>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.