Giấc ngủ kiểu


136

Tôi đang phát triển một trang web trong Angular 2 bằng cách sử dụng Typecript và tôi đã tự hỏi liệu có cách nào để thực hiện thread.sleep(ms)chức năng không.

Trường hợp sử dụng của tôi là chuyển hướng người dùng sau khi gửi biểu mẫu sau vài giây, điều này rất dễ dàng trong html hoặc javascript nhưng tôi không chắc chắn cách thực hiện trong Bản mô tả.

Cảm ơn nhiều,


8
Bản đánh máy là một siêu ký tự của JavaScript. Vì vậy, hãy viết nó bằng JavaScript và ở đó bạn đi: bạn có một giải pháp TypeScript.
JB Nizet

Câu trả lời:


203

Bạn phải đợi TypeScript 2.0 hỗ trợ async/ awaitcho ES5 vì giờ đây nó chỉ hỗ trợ cho quá trình biên dịch TS sang ES6.

Bạn sẽ có thể tạo chức năng trì hoãn với async:

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

Và gọi nó

await delay(300);

Xin lưu ý rằng bạn chỉ có thể sử dụng chức năng awaitbên trong async.

Nếu bạn không thể ( giả sử bạn đang xây dựng ứng dụng nodejs ), chỉ cần đặt mã của bạn vào asynchàm ẩn danh . Đây là một ví dụ:

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

        await delay(1000);

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

Ứng dụng TS mẫu: https://github.com/v-andrew/ts-template

Trong OLD JS bạn phải sử dụng

setTimeout(YourFunctionName, Milliseconds);

hoặc là

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

Tuy nhiên với mọi trình duyệt chính hỗ trợ async/ awaitnó đã lỗi thời.

Cập nhật: TypeScript 2.1 có ở đây với async/await.

Chỉ cần đừng quên rằng bạn cần Promisetriển khai khi bạn biên dịch sang ES5, nơi Promise không có sẵn.


1
Cập nhật : async / await và hỗ trợ trình tạo cho ES5 / ES3 đã được chuyển sang TypeScript 2.1
v-andrew

8
sự kiện không phải chờ đợi, bạn có thể trì hoãn (20000) .then (() => {
ZZZ

1
vì một số lý do, điều này không hiệu quả với tôi await new Promise(resolve => setTimeout(resolve, 1000)).then(()=>console.log("fired"));nhưng điều này đã có hiệu quảawait new Promise(resolve => setTimeout(()=>resolve(), 1000)).then(()=>console.log("fired"));
fjch1997

@ fjch1997, bọc nó trong asyncchức năng. Tôi đã thêm ví dụ
v-andrew

2
Việc khai báo hàm 'delay' không cần từ khóa async, vì nó đã trả về một lời hứa.
SlavaSt

91

Điều này hoạt động: (nhờ các ý kiến)

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

1
Tôi đoán bây giờ đây là câu trả lời được chấp nhận vì đơn giản.
hiển thị

1
@StefanFalk Chào Stefan. Tôi đã chấp nhận câu trả lời khác bởi vì nó bao gồm câu trả lời này và cũng có những cách khác, "kiểu chữ" hơn để thực hiện sự chậm trễ có thể khiến người khác quan tâm. Cá nhân tôi đang sử dụng mã này trong suốt mã của mình vì tôi không thấy bất kỳ lợi ích nào khi sử dụng async / chờ đợi cho nhiệm vụ cụ thể này nhưng tôi không phải là người theo chủ nghĩa thuần túy TS và tôi đi với bất kỳ điều gì dễ dàng / dễ đọc hơn, vì vậy tôi đồng ý với bạn về nguyên tắc :).
kha

31

Vì một số lý do, câu trả lời được chấp nhận ở trên không hoạt động trong các phiên bản mới của Angular (V6).

cho rằng sử dụng này ..

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

ở trên làm việc cho tôi.

Sử dụng:

this.delay(3000);

HOẶC cách chính xác hơn

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

Chỉ cần thay thế '1000' của bạn bằng lệnh gọi tham số ms và nó sẽ hoàn hảo.
greenkin

15

Với RxJS:

import { timer } from 'rxjs';

// ...

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

x là 0.

Nếu bạn đưa ra một số thứ hai periodđến timer, một số điện thoại mới sẽ được phát ra từng periodmili giây (x = 0 thì x = 1, x = 2, ...).

Xem tài liệu chính thức để biết thêm chi tiết.


3
Cảm ơn vì viễn cảnh này, đã đến đây để tìm "cách có thể quan sát"
user230910

0

Nếu bạn đang sử dụng angular5 trở lên, vui lòng bao gồm phương pháp bên dưới trong tệp ts của bạn.

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

sau đó gọi phương thức delay () này bất cứ nơi nào bạn muốn.

ví dụ:

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

Điều này sẽ biến mất tin nhắn gầm gừ sau 3 giây.


0
import { timer } from 'rxjs';

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

cái này tốt hơn cho tôi


Thuộc tính 'lấy' không tồn tại trên loại 'Có thể quan sát <số>'.
Anton Duzenko

nhập {lấy} từ 'rxjs / toán tử';
FabioLux

-3

Hoặc thay vì khai báo một hàm, chỉ cần:

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

Tại sao không phải là một chức năng?
Naveen Kumar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.