2017-11-28 29 views
5

tôi nhận thấy sau trong cơ sở mã Tôi hiện đang làm việc với và không chắc chắn những gì điểm của nó là:Hứa hẹn chỉ trả lại?

public spinnerPromise: Promise<void> = new Promise<void>(() => { return; });

Có một lý do để có một Promise trống rỗng? Điều này nhắc tôi làm một số setTimeOut(fn, 0) và tôi tự hỏi liệu nó có tác dụng tương tự hay không.

Cảm ơn

Trả lời

4

Sửa

Như @Bergi chỉ ra, sự hứa hẹn cho không bao giờ đáp ứng như không ai gọi quyết tâm. Vì vậy, lời hứa trong câu hỏi sẽ không bao giờ gọi bất cứ ai chờ đợi kết quả.

Một lời hứa tương đương với một setTimeOut(fn, 0) sẽ là:

var spinnerPromise: Promise<void> = new Promise<void>(resolve => resolve()); 

gốc

Có tác dụng tương tự. Các yêu cầu Promisespecification rằng ngay cả khi Promise ở trạng thái đã hoàn thành, mọi trình xử lý sẽ không được gọi ngay khi trình xử lý được đăng ký. Nó sẽ chỉ được gọi khi cuộc gọi hiện tại được thực hiện.

spinnerPromise.then (()=> { /* Code called later */ }); 
// Code called after call to then 
+0

Tôi không nhớ bị downvoted, nhưng có thể downvoter cung cấp một lý do? Nếu câu trả lời là sai tôi muốn biết. –

+2

Lời hứa rằng OP chưa bao giờ đi vào trạng thái hoàn thành. – Bergi

+1

@ Bergi vâng bạn đúng, xấu của tôi, tôi đã bỏ lỡ điều đó, tôi đã nghĩ về một lời hứa trông giống như 'lời hứa mới này (r => r()) ' –

3

Có lý do để có một lời hứa trống không?

Tôi không thể nghĩ nhiều. Một trường hợp sử dụng sẽ là một giá trị mà bạn có thể chuyển đến Promise.race và mong đợi nó luôn luôn có lựa chọn khác.

Hãy xem Are JavaScript forever-pending promises bad?Is it safe to not resolve or reject a promise.

Điều này nhắc tôi làm một số setTimeOut(fn, 0) và tôi tự hỏi nếu nó có tác dụng tương tự.

Không, không hề. setTimeout cuối cùng sẽ gọi lại cuộc gọi lại, nhưng new Promise(() => {}).then(…) sẽ không bao giờ xảy ra. Thật giống với việc vượt qua Infinity đến setTimeout (trong đó doesn't really work in reality).

Bạn có thể nghĩ đến Promise.resolve().then(…) hoặc new Promise(r => r()).then(…), sẽ gọi hàm gọi lại ngay lập tức nhưng không đồng bộ.

Các vấn đề liên quan