टाइपस्क्रिप्ट नींद


136

मैं टाइपस्क्रिप्ट का उपयोग करके कोणीय 2 में एक वेबसाइट विकसित कर रहा हूं और मैं सोच रहा था कि क्या thread.sleep(ms)कार्यक्षमता को लागू करने का कोई तरीका है ।

मेरा उपयोग मामला कुछ सेकंड के बाद एक फ़ॉर्म सबमिट करने के बाद उपयोगकर्ताओं को पुनर्निर्देशित करना है जो html या जावास्क्रिप्ट में बहुत आसान है, लेकिन मुझे यकीन नहीं है कि इसे टाइपस्क्रिप्ट में कैसे किया जाए।

बहुत धन्यवाद,


8
टाइपस्क्रिप्ट जावास्क्रिप्ट का एक सुपरसेट है। इसलिए इसे जावास्क्रिप्ट में लिखें, और वहां आप जाएं: आपके पास टाइपस्क्रिप्ट समाधान है।
जेबी निज़ेट

जवाबों:


203

आपको ES5 समर्थन के साथ async/ टाइप टाइप 2.0 के लिए इंतजार करना होगा awaitक्योंकि यह अब केवल TS से ES6 संकलन के लिए समर्थित है।

आप इसके साथ विलंब फ़ंक्शन बना पाएंगे async:

function delay(ms: number) {
    return new Promise( resolve => setTimeout(resolve, ms) );
}

और बुला लो

await delay(300);

कृपया ध्यान दें, कि आप awaitकेवल asyncफ़ंक्शन के अंदर उपयोग कर सकते हैं ।

यदि आप ऐसा नहीं कर सकते ( मान लें कि आप नोडज एप्लिकेशन बना रहे हैं ), तो बस अनाम asyncफ़ंक्शन में अपना कोड रखें । यहाँ एक उदाहरण है:

    (async () => { 
        // Do something before delay
        console.log('before delay')

        await delay(1000);

        // Do something after
        console.log('after delay')
    })();

उदाहरण टीएस आवेदन: https://github.com/v-andrew/ts-template

OLD JS में आपको उपयोग करना है

setTimeout(YourFunctionName, Milliseconds);

या

setTimeout( () => { /*Your Code*/ }, Milliseconds );

हालाँकि हर प्रमुख ब्राउज़र का समर्थन async/ awaitयह अप्रचलित है।

अद्यतन: टाइपस्क्रिप्ट 2.1 यहाँ के साथ है async/await

बस यह मत भूलो कि Promiseजब आप ES5 के लिए संकलन करते हैं, तो आपको कार्यान्वयन की आवश्यकता होती है , जहां वादा मूल रूप से उपलब्ध नहीं है।


1
अद्यतन : ES5 / ES3 के लिए async / प्रतीक्षा और जनरेटर समर्थन टाइपस्क्रिप्ट 2.1 में ले जाया गया
v-andrew

8
प्रतीक्षा के बिना घटना, आप देरी (20000) कर सकते हैं। तब () => {
ZZZ

1
किसी कारण से यह मेरे लिए काम नहीं किया, await new Promise(resolve => setTimeout(resolve, 1000)).then(()=>console.log("fired"));लेकिन यह काम कियाawait new Promise(resolve => setTimeout(()=>resolve(), 1000)).then(()=>console.log("fired"));
fjch1997 20

@ fjch1997, इसे asyncफ़ंक्शन में लपेटें । मैंने उदाहरण जोड़ा
v-andrew

2
'देरी' फ़ंक्शन की घोषणा के लिए async कीवर्ड की आवश्यकता नहीं है, क्योंकि यह पहले से ही एक वादा लौटाता है।
SlavaSt

91

यह काम करता है: (टिप्पणियों के लिए धन्यवाद)

setTimeout(() => 
{
    this.router.navigate(['/']);
},
5000);

1
मुझे लगता है कि यह सादगी के लिए अब तक का स्वीकृत जवाब होना चाहिए।
डिस्प्लेनेम

1
@StefanFalk हाय स्टीफन। मैंने अन्य उत्तर को स्वीकार कर लिया क्योंकि इसमें यह उत्तर शामिल था और इसमें अन्य, अधिक "टाइपस्क्रिप्ट" देरी करने के तरीके भी थे जो दूसरों के लिए रुचि के हो सकते हैं। मैं व्यक्तिगत रूप से अपने पूरे कोड में इस का उपयोग कर रहा हूं क्योंकि मुझे इस विशिष्ट कार्य के लिए async / प्रतीक्षा का उपयोग करने में कोई लाभ नहीं दिखता है, लेकिन मैं TS शुद्धतावादी नहीं हूं और मैं जो भी आसान / अधिक पठनीय है, उसके साथ जाता हूं, इसलिए मैं आपसे सहमत हूं सिद्धांत में :)।
kha

31

किसी कारण से उपरोक्त स्वीकृत उत्तर कोणीय (V6) के नए संस्करणों में काम नहीं करता है।

इस उपयोग के लिए ..

async delay(ms: number) {
    await new Promise(resolve => setTimeout(()=>resolve(), ms)).then(()=>console.log("fired"));
}

ऊपर मेरे लिए काम किया।

उपयोग:

this.delay(3000);

या अधिक सटीक तरीका

this.delay(3000).then(any=>{
     //your task after delay.
});

बस अपने '1000' को ms पैरामीटर कॉल से बदलें और यह एकदम सही होगा।
ग्रीन्सकिन

15

के साथ RxJS:

import { timer } from 'rxjs';

// ...

timer(your_delay_in_ms).subscribe(x => { your_action_code_here })

x 0 है।

यदि आप दूसरा तर्क periodदेते हैं timer, तो एक नया नंबर प्रत्येक periodमिलीसेकंड (x = 0 फिर x = 1, x = 2, ...) से उत्सर्जित किया जाएगा ।

देखें सरकारी दस्तावेज़ अधिक जानकारी के लिए।


3
इस परिप्रेक्ष्य के लिए धन्यवाद, "अवलोकन योग्य रास्ता" खोजने के लिए यहां आया
user230910

0

यदि आप कोणीय 5 और इसके बाद के संस्करण का उपयोग कर रहे हैं, तो कृपया नीचे दी गई विधि को अपनी ts फ़ाइल में शामिल करें।

async delay(ms: number) {
    await new Promise(resolve => setTimeout(()=>resolve(), ms)).then(()=>console.log("fired"));
}

फिर इस विलंब () विधि को आप जहां चाहें कॉल करें।

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

validateInputValues() {
    if (null == this.id|| this.id== "") {
        this.messageService.add(
            {severity: 'error', summary: 'ID is Required.'});
        this.delay(3000).then(any => {
            this.messageService.clear();
        });
    }
}

यह 3 मिनट के बाद मैसेज ग्रोएल को गायब कर देगा।


0
import { timer } from 'rxjs';

await timer(1000).take(1).toPromise();

यह मेरे लिए बेहतर काम करता है


प्रॉपर्टी 'टेक' 'ऑब्जर्वेबल <संख्या>' प्रकार पर मौजूद नहीं है।
एंटोन दुज़ेंको

'rxjs / ऑपरेटर्स' से {take} आयात करें;
FabioLux

-3

या इसके बजाय एक समारोह घोषित करने के लिए, बस:

setTimeout(() => {
    console.log('hello');
}, 1000);

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