2014-10-29 18 views
6

Có cách nào để thực hiện gọi lại trên cả hai kết quả của đối tượng Promise không?JavaScript gốc Lời hứa thực hiện gọi lại trên cả hai kết quả

Ví dụ: tôi muốn thực hiện một số logic dọn dẹp sau khi thực hiện yêu cầu xhr. Vì vậy, tôi cần phải làm một cái gì đó như thế này:

var cleanUp = function() { something.here(); } 
myLib.makeXhr().then(cleanUp,cleanUp); 

Trong jquery Defered ví dụ tôi có thể sử dụng phương pháp luôn():

myLib.makeXhr().always(function() { something.here(); }); 

Liệu Promise hỗ trợ một cái gì đó như thế này?

+0

Tôi thấy bây giờ chỉ có sau đó và các phương pháp đánh bắt https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise Vì vậy, có lẽ không có cách nào (hoặc mở rộng nguyên mẫu để thực hiện điều này) –

+0

jQuery.Deferred(). Sau đó, làm thế nào để giải quyết với nhiều tham số http://stackoverflow.com/questions/24703887/jquery-deferred-then-how-to-resolve -with-multiple-parameters1 – zavg

+1

Khi Benjamin trả lời - không. Thats lý do tại sao tôi thường đi với https://github.com/petkaantonov/bluebird trong trình duyệt và nó tham gia, tất cả, và tất cả các phương pháp khác. Tất nhiên nó không phải là bản địa, nhưng nó là giải pháp cho rất nhiều vấn đề về lời hứa cộng với sự quảng bá. – Jarema

Trả lời

7

Không, đó là không ai. Đó là discussed nhưng thông số kỹ thuật là tối thiểu. Nó không bao gồm một loạt các chức năng khác. Nó được thiết kế để tương thích tốt với các lời hứa của thư viện và cung cấp chức năng đơn giản.

Here is a correct polyfill of that proposal originally made by StefPanner.

Hơn nữa, tôi không đồng ý với số hiện tại bây giờ đã xóa các câu trả lời tự thêm vì chúng tất cả đều làm sai (như một thuộc tính có thể đếm được - không vui). Thậm chí nếu chúng ta bỏ qua những gì nó làm cho các giá trị trả về và trạng thái lỗi của lời hứa trả lại. Cách dự định để mở rộng các lời hứa gốc là bằng cách phân lớp chúng, thật đáng buồn là không có trình duyệt nào hỗ trợ điều này, vì vậy chúng tôi sẽ phải đợi.

Thay vì rối tung với nguyên mẫu bản địa, chúng ta nên sử dụng một mô hình khác nhau:

openDb().then(foo).then(bar).finally(close).then(more); 

là nhạy cảm đối với chúng ta quên để gọi gần, ngay cả nếu chúng ta mở nó 100 lần trong ứng dụng của chúng tôi, quên để đóng nó thậm chí một lần vẫn có thể tàn phá. Mặt khác - chúng ta có thể sử dụng mô hình, tiêu hủy mà một số thư viện hứa hẹn cung cấp được xây dựng trong chính chúng ta:

openDb(function(db){ 
    return foo(db).then(bar);// chain here 
}).then(more); 

Về cơ bản - mô hình này có nghĩa là thay vì có openDB trở lại một lời hứa - chúng tôi có mất một hàm trở lại một lời hứa, khi chức năng được chạy, nếu nó trả về một lời hứa, chúng tôi chờ đợi lời hứa đó để giải quyết. Nó trông giống như sau:

function openDb(withDb){ 
    return justOpenWithoutCleanUp(). 
      then(withDb). 
      then(clean, function(e){ clean(); throw e; }); // note the rethrow 
} 
-4

Đối tượng lời hứa hỗ trợ 'luôn luôn'. .

Đối với ví dụ:

var oPromise = jQuery.ajax ({ url: your_URL }) luôn (function() { YOUR_CLEAN_UP_METHOD();} )

+0

@SanketPipariya Nó không phải là câu hỏi, nhưng trả lời – zavg

+0

@SanketPipariya Tôi nghĩ rằng ông đã cố gắng để trả lời! – CinCout

+0

Các downvoters không nói cho bạn - nhưng họ đang downvoting bạn cho việc sử dụng jQuery ở đây - nó không liên quan đến câu hỏi thảo luận về những lời hứa gốc. –

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