मैं Node.js (जावास्क्रिप्ट) में कैसे प्रतीक्षा कर सकता हूं, मुझे समय की अवधि के लिए रुकने की आवश्यकता है


385

मैं व्यक्तिगत जरूरतों के लिए स्क्रिप्ट की तरह एक कंसोल विकसित कर रहा हूं। मुझे समय की एक विस्तारित राशि के लिए विराम देने में सक्षम होना चाहिए, लेकिन, मेरे शोध से, नोड.जेएस के पास आवश्यक रूप से रोकने का कोई तरीका नहीं है। एक समय के बाद उपयोगकर्ताओं की जानकारी को पढ़ना मुश्किल हो रहा है ... मैंने कुछ कोड वहां देखे हैं, लेकिन मेरा मानना ​​है कि उनके लिए उनके अंदर अन्य कोड होना चाहिए जैसे कि:

setTimeout(function() {
}, 3000);

हालांकि, मुझे समय की अवधि के बाद कोड की इस लाइन को निष्पादित करने के लिए सब कुछ चाहिए।

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

//start-of-code
console.log('Welcome to My Console,');
some-wait-code-here-for-ten-seconds..........
console.log('Blah blah blah blah extra-blah');
//endcode. 

मैंने भी चीजों को देखा है

yield sleep(2000);

लेकिन नोड.जेएस इसे मान्यता नहीं देता है।

मैं इस विस्तारित ठहराव को कैसे प्राप्त कर सकता हूं?


3
होव्स के बारे में आप इन लोगों में से एक को सही उत्तर के रूप में चिह्नित करते हैं :)
बिलीबोनक्स

1
require("child_process").execSync('php -r "sleep($argv[1]);" ' + seconds);
क्रिसटन

नोड नींद NPM मॉड्यूल चाल हो सकती है (हालांकि, मैं केवल डीबगिंग के लिए यह प्रयोग करेंगे)
जूलियन सोरो

जवाबों:


211

इसका सबसे अच्छा तरीका यह है कि आप अपने कोड को कई कार्यों में तोड़ दें, जैसे:

function function1() {
    // stuff you want to happen right away
    console.log('Welcome to My Console,');
}

function function2() {
    // all the stuff you want to happen after that pause
    console.log('Blah blah blah blah extra-blah');
}

// call the first chunk of code right away
function1();

// call the rest of the code and have it execute after 3 seconds
setTimeout(function2, 3000);

यह जॉनीएचके के समाधान के समान है , लेकिन बहुत अधिक खाने और विस्तार करने में आसान है।


7
@LucasSeveryn आप तब कुछ गलत कर रहे हैं। यह एक कोर डिजाइन पैटर्न है।
इलियट बोनेविले

और आप क्या करते हैं जब फ़ंक्शन की शुरुआत केवल एक फ़ंक्शन दूर नहीं होती है, लेकिन कोड से 10 फाइलें दूर होती हैं, जिन्हें डी-एसिंक्रोनाइज़ करने की आवश्यकता होती है?
सिरिल डचोन-डोरिस

10
@ साइरिलडचोन-डोरिस क्या?
अट्टुरस

3
एक सुंदर वादा आधारित समाधान के लिए @ मशीनघट के उत्तर का उपयोग करें जिसे कोई कस्टम कोड की आवश्यकता नहीं है और प्रतीक्षित / async का समर्थन करता है
डेन मैकॉले

यह async है, इसका मतलब है कि यदि function1 3 सेकंड से पहले समाप्त हो जाता है, तो वे एक दूसरे को ओवरलैप करना शुरू करते हैं। तब आप वापस भी नहीं लौट सकते हैं और यह लगभग कभी भी उपयोगी नहीं है। एकमात्र तरीका जो मैंने अब तक पाया, वह थाdebugger;
क्रिस्टियन ट्रेना

426

एक पुराने प्रश्न का नया उत्तर। आज ( जनवरी 2017 जून 2019) यह बहुत आसान है। आप नए async/awaitसिंटैक्स का उपयोग कर सकते हैं । उदाहरण के लिए:

async function init() {
  console.log(1);
  await sleep(1000);
  console.log(2);
}

function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}   

async/awaitइंस्टॉल और प्लगइन्स के बिना बॉक्स से बाहर का उपयोग करने के लिए, आपको --harmonyध्वज का उपयोग करके नोड-वी 7 या नोड-वी 8 का उपयोग करना होगा ।

अपडेट जून 2019: NodeJS के नवीनतम संस्करणों का उपयोग करके आप इसे बॉक्स से बाहर कर सकते हैं। कमांड लाइन तर्क देने की आवश्यकता नहीं है। यहां तक ​​कि Google Chrome आज भी इसका समर्थन करता है।

मई 2020 तक अपडेट करें: जल्द ही आप awaitएक एसिंक्स फ़ंक्शन के बाहर सिंटैक्स का उपयोग कर पाएंगे । इस उदाहरण में शीर्ष स्तर की तरह

await sleep(1000)
function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
} 

प्रस्ताव चरण 3 में है । आप इसे आज वेबप 5 (अल्फा) का उपयोग करके उपयोग कर सकते हैं,

और जानकारी:


5
मुझे लगता है कि आप के awaitसामने कीवर्ड भूल गएsleep(1000)
रयान जार्विस

6
यह वास्तव में उत्तर होना चाहिए, नींद का नोड। जेएस पैकेज परेशानी भरा हो सकता है।
स्टुअर्ट एलन

4
सबसे अच्छा समाधान वास्तव में
कोस्टा सिनाबिस

40
let sleep = ms => new Promise(resolve => setTimeout(resolve, ms));ऑनलाइनर शैतान के लिए खुद की तरह :)
प्राग्रैग स्टोजादिनोविक

21
let sleep = require('util').promisify(setTimeout);नोड 7.6+ पर काम करता है और पठनीयता में सुधार करता है
ब्रायनएचवीबी

216

किसी भी निर्भरता के बिना सबसे छोटा समाधान:

await new Promise(resolve => setTimeout(resolve, 5000));

14
"परिष्कार की ऊंचाई सादगी है।" - क्लेर बूथ लूस। यह अब तक का सबसे अच्छा जवाब है, IMO।
अर्नोल्ड

3
यह स्पष्ट रूप से अन्य उत्तरों की तुलना में बहुत अधिक हाल ही में है, लेकिन यह 2018 के रूप में सबसे अधिक सुरुचिपूर्ण है जो कोड के लिए किसी भी अन्य प्रभाव के बिना 1 पंक्ति में काम करता है।
जड़ी

1
यह अच्छा है। आपको NodeJS 7.6.0 या इसके बाद के संस्करण का उपयोग करना होगा। यह पुराने संस्करणों पर काम नहीं करेगा।
रयान

5
let sleep = require('util').promisify(setTimeout);तीन अक्षर लंबा है, लेकिन पुन: प्रयोज्य और अधिक पठनीय है
ब्रायनएचवीबी

2
एक अनुलग्‍नक शिकायत से बचने के लिए, इसके resolveबजाय कॉल करें done। यानीawait new Promise(resolve => setTimeout(resolve, 5000))
डैरेन कुक

150

setTimeoutकॉलबैक के भीतर देरी के बाद आप जिस कोड को निष्पादित करना चाहते हैं उसे डालें :

console.log('Welcome to My Console,');
setTimeout(function() {
    console.log('Blah blah blah blah extra-blah');
}, 3000);

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

32
@ElliotBonneville यह अवधारणा को चित्रित करने के लिए सिर्फ एक उदाहरण है। जाहिर है कि आप इनलाइन कोड का उपयोग करने के बजाय एक फ़ंक्शन कॉल में कोड को (और) कारक बनाना चाहते हैं, जैसे कि कहीं और।
जॉनीएचके

@ChristopherKemp: Node.js को इस नाम से हल करने की बारी है node-fibersइसकी जांच - पड़ताल करें।
इलियट बोनविले

यह एक महान समाधान है, खासकर यदि आप किसी भी कोड को निष्पादित नहीं करना चाहते हैं, तो आप बस लूप के अंदर "नींद" विधि की नकल करना चाहते हैं। इस उदाहरण में कुछ भी गलत नहीं है।
हाफस्टॉप 17

यह ग्राहक से आने वाले अनुरोधों में देरी के लिए एकदम सही है, मैंने इस दृष्टिकोण का उपयोग ग्राहक पक्ष पर अपने लोडिंग स्पिनरों का परीक्षण करने के लिए किया है
मोइन राहिमी

145

यह एक सरल अवरोधन तकनीक है:

var waitTill = new Date(new Date().getTime() + seconds * 1000);
while(waitTill > new Date()){}

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


27
भयानक या नहीं, यह एक सरल करता है wait, यह ब्लॉक करता है और यह कुछ परीक्षण उद्देश्य के लिए काम करता है। बिल्कुल वही जो मैं खोज रहा था।
क्लीजर्स

8
पूरी तरह से तीसरे पक्ष के काम के बिना सवाल का जवाब देता है, और सरल है। फिर भी लोग कहते हैं "भयानक" .... यह भारी सीपीयू लोड आदि के अनुकरण के लिए बहुत अच्छा है। Btw इस phpied.com/sleep-in-javascript के
डॉन चेडल

2
इसके अलावा, यह आवश्यक तरीका है यदि आप कुछ ऐसा अनुकरण करने की कोशिश कर रहे हैं जो इवेंट लूप को धीमा कर देगा, इस प्रकार अन्य उपयोगकर्ताओं / कनेक्शनों को भी धीमा कर देगा। विलंबित कॉलबैक जोड़ने से अन्य उपयोगकर्ता / कनेक्शन प्रभावित नहीं होंगे।
डॉन चेडल

13
यह ए spin-wait
माइक एटलस

7
@ लक्ष्य है कि लगता है।
फेलिक्स गगनोन-ग्रेनियर

63

नोड पर 7.6.0 या अधिक

नोड देशी रूप से प्रतीक्षा करने का समर्थन करता है:

const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));

तब यदि आप async फ़ंक्शन का उपयोग कर सकते हैं:

await sleep(10000); // sleep for 10 seconds

या:

sleep(10000).then(() => {
  // This will execute 10 seconds from now
});

पुराने नोड संस्करणों पर (मूल उत्तर)

मैं एक अतुल्यकालिक नींद चाहता था जो विंडोज और लिनक्स में काम करता था, मेरे सीपीयू को लंबे समय तक लूप के बिना हॉगिंग करता था। मैं नींद पैकेज की कोशिश की, लेकिन यह मेरे विंडोज बॉक्स पर स्थापित नहीं होगा। मैंने प्रयोग करके समाप्त किया:

https://www.npmjs.com/package/system-sleep

इसे स्थापित करने के लिए, टाइप करें:

npm install system-sleep

आपके कोड में,

var sleep = require('system-sleep');
sleep(10*1000); // sleep for 10 seconds

एक जादू की तरह काम करता है।


1
महान जवाब धन्यवाद - यह कुछ असंभव कोड संभव बना दिया - यह एक स्पिन इंतजार नहीं है
danday74

1
आगे के शोध पर यह मॉड्यूल deasync पर निर्भर करता है जिसे किसी अन्य deasync github repo से कांटा जाता है। मूल रेपो इसे हैक न होने के रूप में उपयोग नहीं करने की चेतावनी देता है। यह काम करता है लेकिन सभी प्लेटफार्मों पर नहीं तो अगर आपको क्रॉस प्लेटफॉर्म समाधान की आवश्यकता है तो इससे बचें।
danday74

1
हां, मैंने कभी भी इसके साथ और इसके देव के लिए महान होने का अनुभव नहीं किया है - हुड के तहत मेरा मानना ​​है कि यह सी या सी ++ पर निर्भर करता है जो व्यापक रूप से उपलब्ध है, लेकिन मुझे लगता है कि कुछ मशीनों पर इसका नहीं है और जब यह विफल हो जाता है तो यह समस्या का कारण बनता है - यदि यह विफल रहता है तो सिस्टम स्लीप एक स्पिन इंतजार में गिर जाता है जो कोड निष्पादन को रोक देगा
danday74

1
यह पैकेज मैक ओएस पर काम नहीं करता है, और इसलिए यह संगत नहीं है, और इसलिए काम करने योग्य नहीं है। देखें github.com/jochemstoel/nodejs-system-sleep/issues/4
nuzzolilo

1
@Nuzzolilo अजीब है। हमारे पास मैक ओएस पर एक डेवलपर है और उसने कभी भी कुछ भी गलत नहीं बताया है। मुझे संदेह है कि यह एक विशिष्ट मैक ओएस संस्करण है। मैंने इस उत्तर को भी अपडेट किया क्योंकि नींद मूल रूप से NodeJS के नए संस्करणों में बनाई गई है।
रयान

62

आधुनिक जावास्क्रिप्ट का उपयोग करके सरल और सुरुचिपूर्ण नींद समारोह

function sleep(millis) {
    return new Promise(resolve => setTimeout(resolve, millis));
}

कोई निर्भरता नहीं, कोई कॉलबैक नरक नहीं; बस :-)


प्रश्न में दिए गए उदाहरण को ध्यान में रखते हुए, यह है कि हम दो कंसोल लॉग के बीच कैसे सोएंगे:

async function main() {
    console.log("Foo");
    await sleep(2000);
    console.log("Bar");
}

main();

"दोष" यह है कि आपका मुख्य कार्य अब भी होना है async। लेकिन, यह देखते हुए कि आप पहले से ही आधुनिक जावास्क्रिप्ट कोड लिख रहे हैं, आप शायद (या कम से कम होना चाहिए!) अपने कोड में async/ awaitसभी का उपयोग कर रहे हैं , इसलिए यह वास्तव में कोई मुद्दा नहीं है। सभी आधुनिक ब्राउज़र आज इसका समर्थन करते हैं।

sleepउन लोगों के लिए फ़ंक्शन में थोड़ी अंतर्दृष्टि देना , जिनका उपयोग async/awaitऔर वसा तीर ऑपरेटरों के लिए नहीं किया जाता है , यह इसे लिखने का क्रिया तरीका है:

function sleep(millis) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () { resolve(); }, millis);
    });
}

वसा तीर ऑपरेटर का उपयोग करना, हालांकि, इसे और भी छोटा (और अधिक सुरुचिपूर्ण) बनाता है।


1
आप नींद के कार्य को भी लिख सकते हैं asyncऔर बाकी सब समान छोड़ सकते हैं। यह asyncहालांकि के साथ शायद स्पष्ट है ।
केविन पेना

अच्छा कैच, @ केविनपेना। वास्तव में, मुझे लगता है कि मैं इसके बिना पसंद करता हूं async। आपके सुझाव के साथ मेरे उत्तर का संपादन किया। मुझे नहीं लगता कि यह कोड को स्पष्ट करता है; उसके लिए, मैं इसके बजाय JSDoc का सहारा लूंगा।
लुसियो पावा

8
मुझे अपनी लिपियों में निम्नलिखित एक-लाइनर const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
रखना पसंद है

46

आप इस www.npmjs.com/package/sleep का उपयोग कर सकते हैं

var sleep = require('sleep');
sleep.sleep(10); // sleep for ten seconds

4
यह ठीक काम करता है MacOS, लेकिन यह नोड_गाइप त्रुटियों केCentOS कारण त्रुटियों का सामना करता है । यह पोर्टेबल नहीं लगता है।
अचलोइलू

1
शायद समस्या नोड निर्माण द्वारा ओएस द्वारा नहीं पैदा की, इसके
Aleksej

34

यह प्रश्न काफी पुराना है, लेकिन हाल ही में V8 ने जनरेटरों को जोड़ा है जो ओपी द्वारा अनुरोध किए गए काम को पूरा कर सकते हैं। जेनरेटर आमतौर पर एक पुस्तकालय जैसे सस्पेंड या जीन-रन की सहायता से एसिंक्स इंटरैक्शन के लिए उपयोग करना सबसे आसान है ।

यहां सस्पेंड का उपयोग कर एक उदाहरण दिया गया है:

suspend(function* () {
    console.log('Welcome to My Console,');
    yield setTimeout(suspend.resume(), 10000); // 10 seconds pass..
    console.log('Blah blah blah blah extra-blah');
})();

संबंधित पढ़ना (बेशर्म प्रचार के माध्यम से): जनरेटर के साथ बड़ा सौदा क्या है?


2
अच्छा जवाब - लेकिन पढ़ना चाहिएyield setTimeout(suspend.resume(), 10000);
edhubbell

1
धन्यवाद, @edhubbell यह उत्तर निलंबन के एक बहुत पुराने संस्करण पर आधारित था, लेकिन आप नवीनतम के बारे में सही हैं। मैं जवाब अपडेट कर दूंगा।
jmar777

नोड किस संस्करण के लिए है?
danday74 21

1
@ danday74 मैं ठीक से याद नहीं कर सकता, जब वे संयुक्त राष्ट्र के ध्वजांकित थे, लेकिन वे --harmonyध्वज के पीछे v0.12 के बाद से रहे हैं , और नोड.ग्रीन के अनुसार, वे कम से कम उपलब्ध हैं बिना किसी झंडे के v4.8.4: नोड.ग्रीन /#ES2015-functions-generators-basic-functionality । कृपया ध्यान दें, हालांकि, नया async/awaitसिंटैक्स अब इसके लिए एक बेहतर समाधान प्रदान करता है, जिसमें अतिरिक्त पुस्तकालयों की आवश्यकता नहीं है suspend। : एक उदाहरण के लिए इस उत्तर देखें stackoverflow.com/a/41957152/376789 । V7.10 के बाद से Async फ़ंक्शन उपलब्ध हैं (झंडे के बिना)।
jmar777

20

लिनक्स / नोडज पर यह मेरे लिए काम करता है:

const spawnSync = आवश्यकता ('child_process')। spawnSync;

var sleep = spawnSync ('स्लीप', [1.5]);

यह अवरुद्ध है, लेकिन यह एक व्यस्त प्रतीक्षा पाश नहीं है।

आपके द्वारा निर्दिष्ट समय सेकंड में है, लेकिन एक अंश हो सकता है। मुझे नहीं पता कि अन्य OS का कमांड इसी तरह का है।


sleepबहुत ही सर्वव्यापी है और शुरुआती यूनिक्स दिनों के बाद से एक उपयोगितावादी घेर लिया गया है en.wikipedia.org/wiki/Sleep_%28Unix%29 । केवल "दुर्लभ नहीं" ओएस यह शायद मौजूद नहीं होता खिड़कियों लेकिन वहाँ आप का प्रयास कर सकता है (child_process.spawnSync('timeout', ['/T', '10'])
humanityANDpeace

17

यदि आप "कोड गोल्फ" करना चाहते हैं, तो आप यहां कुछ अन्य उत्तरों का एक छोटा संस्करण बना सकते हैं:

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

लेकिन वास्तव में मेरी राय में आदर्श उत्तर नोड की utilलाइब्रेरी और उसके promisifyफ़ंक्शन का उपयोग करना है, जो वास्तव में इस तरह की चीज़ के लिए डिज़ाइन किया गया है (पहले से मौजूद गैर-वादा-आधारित सामान का वादा-आधारित संस्करण बनाना):

const util = require('util');
const sleep = util.promisify(setTimeout);

किसी भी स्थिति में आप awaitअपने sleepफ़ंक्शन को कॉल करने के लिए बस रोक सकते हैं :

await sleep(1000); // sleep for 1s/1000ms

वास्तव में, use.promisify का उपयोग करके, कॉलबैक प्रदान किए बिना नींद को कॉल करना संभव नहीं है। nodejs.org/api/…
होवी

1
तुम्हारी याद आ रही है await। यह एक कॉलबैक बनाता है, चीजों को रोक देता है, और फिर उस कॉलबैक के वापस आने पर कोड को पुनरारंभ करता है। कॉलबैक एक मान के साथ लौटता है, लेकिन हम इस मामले में इसकी परवाह नहीं करते हैं, इसलिए इसके बाईं ओर कुछ भी नहीं है await
मशीनगॉस्ट

1
कोड गोल्फ को शराब देने के लिए इसे एक पंक्ति में लिखें;) कॉन्स्ट स्लीप = आवश्यकता ('उपयोग')।
फैबियन

14

मैंने हाल ही में सरल एब्स्ट्रेक्ट बनाया है जिसे वेट कहा जाता है । सिंक मोड ( as- नोड-फाइबर पर आधारित) में async फ़ंक्शन को कॉल करने के लिए। आगामी ES6 जेनरेटर पर आधारित एक संस्करण भी है।

https://github.com/luciotato/waitfor

Wait.for का उपयोग करके , आप किसी भी मानक नोड्ज को async फ़ंक्शन कह सकते हैं, जैसे कि यह नोड के इवेंट लूप को अवरुद्ध किए बिना एक सिंक फ़ंक्शन था।

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

प्रतीक्षा का उपयोग कर। यदि आपका कोड होगा:

require('waitfor')

..in a fiber..
//start-of-code
console.log('Welcome to My Console,');
wait.miliseconds(10*1000); //defined in waitfor/paralell-tests.js - DOES NOT BLOCK
console.log('Blah blah blah blah extra-blah');
//endcode. 

साथ ही किसी भी async फ़ंक्शन को सिंक मोड में कहा जा सकता है। उदाहरण देखें।


TypeError: Object #<Object> has no method 'miliseconds'
कैफीनएडक्शन

टिप्पणी कहती है: "// वेटफ़ोर / पैरेलल-टेस्ट्स.जेएस में परिभाषित" इसे उस फ़ाइल से हड़प लें।
लुसियो एम। ततो

2
मेरे द्वारा इसे प्राप्त करने के बाद मुझे wait.for/paralell-tests.jsअपरिभाषित गुणों आदि से संबंधित एक और त्रुटि का सामना करना पड़ा, इसलिए मुझे उन्हें भी कॉपी करने की आवश्यकता थी। आप कोड को इस तरह से व्यवस्थित क्यों नहीं करते हैं कि इसकी आवश्यकता नहीं होगी?
user907860

Wait.for और अन्य फाइबर समाधान ने मेरे लिए एक पूरी नई दुनिया खोल दी है! अगर मैं कर सकता तो मैं इसे एक लाख बार वोट देता। यद्यपि अधिकांश नोडज समुदाय फाइबर का विरोध करते हैं, मुझे लगता है कि वे एक शानदार जोड़ हैं और निश्चित रूप से जब कॉलबैक नरक की बात आती है तो उनका स्थान निश्चित होता है।
लेवी रॉबर्ट्स

7

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

तो Node.js इस प्रकार है,

process.nextTick()

बाद में setTimeout () कोड चलाने के लिए। उदाहरण के लिए,

process.nextTick(function(){
    console.log("This will be printed later");
});

2

ईएस 6 सपोर्टिंग Promiseएस के साथ, हम उन्हें बिना किसी तीसरे पक्ष की सहायता के उपयोग कर सकते हैं।

const sleep = (seconds) => {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, (seconds * 1000));
    });
};

// We are not using `reject` anywhere, but it is good to
// stick to standard signature.

फिर इसे इस तरह उपयोग करें:

const waitThenDo(howLong, doWhat) => {
    return sleep(howLong).then(doWhat);
};

ध्यान दें कि doWhatफ़ंक्शन resolveकॉलबैक हो जाता है new Promise(...)

यह भी ध्यान दें कि यह ASYNCHRONOUS नींद है। यह ईवेंट लूप को ब्लॉक नहीं करता है। यदि आपको अवरुद्ध नींद की आवश्यकता है, तो इस लाइब्रेरी का उपयोग करें जो सी ++ बाइंडिंग की मदद से नींद को अवरुद्ध करने का एहसास करता है। (हालांकि Async वातावरण की तरह नोड में एक अवरुद्ध नींद की आवश्यकता दुर्लभ है।)

https://github.com/erikdubbelboer/node-sleep


1
let co = require('co');
const sleep = ms => new Promise(res => setTimeout(res, ms));

co(function*() {
    console.log('Welcome to My Console,');
    yield sleep(3000);
    console.log('Blah blah blah blah extra-blah');
});

ऊपर दिया गया यह कोड जावास्क्रिप्ट के अतुल्यकालिक कॉलबैक नरक समस्या को हल करने का साइड इफेक्ट है। यही कारण है कि मुझे लगता है कि जावास्क्रिप्ट को बैकएंड में एक उपयोगी भाषा बनाता है। वास्तव में यह मेरी राय में आधुनिक जावास्क्रिप्ट के लिए पेश किया गया सबसे रोमांचक सुधार है। पूरी तरह से यह समझने के लिए कि यह कैसे काम करता है, जनरेटर के काम को पूरी तरह से समझने की आवश्यकता कैसे है। functionकीवर्ड एक के बाद *आधुनिक जावास्क्रिप्ट में एक जनरेटर समारोह कहा जाता है। एनपीएम पैकेज coने एक जनरेटर चलाने के लिए एक रनर फ़ंक्शन प्रदान किया।

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


हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन समस्या को हल करने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करता है और यह समस्या को हल करता है ताकि उत्तर के दीर्घकालिक मूल्य में सुधार हो सके।
डोनाल्ड डक

धन्यवाद @ डोनल्डडक। मेरे उत्तर में कोड शायद जावास्क्रिप्ट में सुधार का सबसे रोमांचक हिस्सा है। मैं बहुत हैरान हूं कि कुछ सुपर स्मार्ट लोग कॉलबैक नरक की समस्या को हल करने के लिए इस तरह से सोचते हैं।
कियान चेन

1

यह @ atlex2 द्वारा सुझाए गए गंदे अवरोधक दृष्टिकोण पर आधारित एक क्षण है। जेएस फ्लेवर मॉड्यूल । यह केवल परीक्षण के लिए उपयोग करें

const moment = require('moment');

let sleep = (secondsToSleep = 1) => {
    let sleepUntill = moment().add(secondsToSleep, 'seconds');
    while(moment().isBefore(sleepUntill)) { /* block the process */ }
}

module.exports = sleep;

0

यदि आपको परीक्षण उद्देश्य के लिए निलंबित करने की आवश्यकता है तो आप वर्तमान थ्रेड निष्पादन की कोशिश करेंगे:

function longExecFunc(callback, count) {

    for (var j = 0; j < count; j++) {
        for (var i = 1; i < (1 << 30); i++) {
            var q = Math.sqrt(1 << 30);
        }
    }
    callback();
}
longExecFunc(() => { console.log('done!')}, 5); //5, 6 ... whatever. Higher -- longer

0

कुछ घटनाओं के घटित होने के लिए हम 5 सेकंड प्रतीक्षा करने जा रहे हैं (जो कि कोड में कहीं और सही करने के लिए किए गए चर सेट द्वारा इंगित किया जाएगा) या जब टाइमआउट समाप्त हो जाता है कि हम हर 100ms की जाँच करेंगे

    var timeout=5000; //will wait for 5 seconds or untildone
    var scope = this; //bind this to scope variable
    (function() {
        if (timeout<=0 || scope.done) //timeout expired or done
        {
            scope.callback();//some function to call after we are done
        }
        else
        {
            setTimeout(arguments.callee,100) //call itself again until done
            timeout -= 100;
        }
    })();

0

कुछ लोगों के लिए, स्वीकृत उत्तर काम नहीं कर रहा है, मुझे यह अन्य उत्तर मिला और यह मेरे लिए काम कर रहा है : मैं एक पैरामीटर को सेटटाइमआउट () कॉलबैक में कैसे पारित कर सकता हूं?

var hello = "Hello World";
setTimeout(alert, 1000, hello); 

'हैलो' वह पैरामीटर है जिसे पारित किया जा रहा है, आप टाइमआउट समय के बाद सभी मापदंडों को पारित कर सकते हैं। उत्तर के लिए @ फाबियो पीएचएमएस का धन्यवाद।


0

इन सभी सेटटाइमआउट, नींद और कई अन्य चीजों को करने के बजाय, इसका उपयोग करना बेहतर है

const delay = require('delay');
await delay(2000); // will wait for 2 seconds before executing next line of code

क्या आप बता सकते हैं कि 'देरी' क्या है, और इसके डॉक्स से क्या लिंक है? यह बेहतर क्यों है?
boycy

-2

अन्य उत्तर बहुत अच्छे हैं, लेकिन मुझे लगा कि मैं एक अलग तरह की रणनीति बनाऊंगा।

यदि आप वास्तव में सब कुछ देख रहे हैं, तो लिनक्स में एक विशिष्ट फ़ाइल को धीमा करना है:

 rm slowfile; mkfifo slowfile; perl -e 'select STDOUT; $| = 1; while(<>) {print $_; sleep(1) if (($ii++ % 5) == 0); }' myfile > slowfile  &

नोड myprog slowfile

यह हर पांच लाइनों में 1 सेकंड सोएगा। नोड प्रोग्राम लेखक की तरह धीमा होगा। यदि यह अन्य काम कर रहा है तो वे सामान्य गति से जारी रहेंगे।

Mkfifo पहले-में-पहले पाइप बनाता है। यह वही है जो यह काम करता है। पर्ल लाइन जितनी तेजी से आप चाहते हैं लिखेंगे। $। = 1 का कहना है कि आउटपुट को बफर मत करो।


-3

मैंने एक साथ रखा, इस प्रश्न के उत्तर को पढ़ने के बाद, एक साधारण फ़ंक्शन जो कॉलबैक भी कर सकता है, यदि आपको इसकी आवश्यकता है:

function waitFor(ms, cb) {
  var waitTill = new Date(new Date().getTime() + ms);
  while(waitTill > new Date()){};
  if (cb) {
    cb()
  } else {
   return true
  }
}

-4

अधिक जानकारी के लिए

yield sleep(2000); 

आपको Redux-Saga की जाँच करनी चाहिए । लेकिन यह आपके मॉडल ढांचे के रूप में Redux की आपकी पसंद के लिए विशिष्ट है (हालांकि सख्ती से आवश्यक नहीं)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.