2013-08-16 27 views
15

Tôi vẫn chưa rõ sự khác biệt giữa việc gọi giải quyết của resolver() vs fulfill()? Tôi thấy cả hai chức năng và các thuật ngữ "giải quyết một lời hứa" và "thực hiện một lời hứa" được batting xung quanh rất nhiều.q.js: sự khác biệt giữa giải quyết() và hoàn thành()

Khi nào tôi nên sử dụng từng loại?

+0

Tôi không thấy phương thức 'hoàn thành' trong tài liệu' q'. https://github.com/kriskowal/q/wiki/API-Reference – Barmar

+0

xem thêm [Thuật ngữ chính xác cho lời hứa javascript] là gì (http://stackoverflow.com/a/29269515/1048572) – Bergi

Trả lời

17

Bạn nên sử dụng resolve. deferredPromise.resolve(nextPromise) có nghĩa là mọi thứ đang đợi deferredPromise giờ sẽ đợi nextPromise. Nếu nextPromise không phải là một lời hứa ở tất cả, nó được biến thành một lời hứa hoàn thành mà đi vào để thông báo bất cứ điều gì chờ đợi cho nó rằng giá trị đã trở thành có sẵn.

Phương pháp fulfill là ý tưởng tồi sẽ không được dùng nữa và cuối cùng sẽ biến mất hoàn toàn. fulfill tương đương ngữ nghĩa với resolve trong tất cả các trường hợp hữu ích. Đó là lý do duy nhất để tồn tại là deferredPromise.fulfill(value) dễ dàng hơn để con người diễn giải hơn deferredPromise.resolve(value), vì resolve bị quá tải để xử lý cả hai số nextPromisefinalValue.

Sự cố với fulfill hiện có ở tất cả là deferredPromise.fulfill(rejectedPromise) là nghịch lý ngữ nghĩa.

+0

… trừ khi chúng tôi cho phép các lời hứa lồng nhau - tinh khiết ngữ nghĩa :-) – Bergi

+0

@Bergi, đã có nhiều cuộc thảo luận về điều này, nhưng 'giải quyết' không cần phải thay đổi. Có một cuộc nói chuyện về sự ép buộc di chuyển vào 'sau đó' (và những người khác), và sử dụng' flatMap' để bỏ đi những lời hứa nghiêm túc. –

15

Nói chung, giải quyết có nghĩa là EITHER thành công hay thất bại. Đó là những gì gây nên sự kêu gọi của các hành động then. Nó có thể xảy ra chính xác một lần cho bất kỳ lời hứa nào.

thực hiện có nghĩa là "giải quyết" thành công. Điều đó sẽ kích hoạt các cuộc gọi lại thành công trong các hành động then. Đối tác "hoàn thành" cho thất bại là từ chối. Từ góc độ khác, bạn có thể phân loại trạng thái của bất kỳ lời hứa nào tại một thời điểm cụ thể trong thời gian "chưa được giải quyết" (đôi khi còn được gọi là đang chờ xử lý) hoặc "đã giải quyết" và "đã giải quyết" có các trạng thái con của "đã hoàn thành" và "bị từ chối". Lời hứa trong trạng thái "đã hoàn thành" có giá trị và lời hứa trong trạng thái "bị từ chối" có lý do lý do.

Các phương pháp cụ thể trong từng API được sử dụng để thể hiện các khái niệm này khác nhau. Và thật không may, có nhiều bài đăng trên blog và tài liệu ở đó gây nhầm lẫn các điều khoản này, đặc biệt bằng cách sử dụng "fullfill" khi chúng có nghĩa là "giải quyết" hoặc ngược lại.

Q

Tôi không biết Q rất tốt, nhưng có vẻ như phương pháp resolve của nó thực sự đáp ứng lời hứa (nhấn mạnh thêm):

Calling quyết tâm với một tổ chức phi lời hứa nguyên nhân giá trị hứa hẹn là được đáp ứng với giá trị đó.

Tuy nhiên, bạn cũng có thể gọi số deferred.resolve với lời hứa, trong trường hợp lời hứa đầu tiên ít nhiều giả định trạng thái lời hứa đã được truyền. Ví dụ: nếu lời hứa đã qua được ở trạng thái "đang chờ xử lý", lời hứa sẽ thông qua trạng thái đang chờ xử lý của lời hứa đã qua. Điều đó ngụ ý ngữ nghĩa hơi kỳ quặc rằng một phương thức có tên là resolve thực sự không giải quyết được lời hứa.

+0

Tôi thích lời giải thích của bạn . Bạn nói đúng, thực sự khó hiểu rằng việc triển khai API khác nhau chọn ý nghĩa khác nhau cho 'giải quyết' và' thực hiện'. – demisx

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