2015-12-30 17 views
37

Tôi đã từng phát triển rất nhiều hứa hẹn và bây giờ tôi đang chuyển sang RxJS. Tài liệu của RxJS không cung cấp một ví dụ rất rõ ràng về cách chuyển từ chuỗi lời hứa sang trình tự quan sát.Chuỗi RxJS tương đương với lời hứa.then()?

Ví dụ, tôi thường viết chuỗi lời hứa với nhiều bước, như

// a function that returns a promise 
getPromise() 
.then(function(result) { 
    // do something 
}) 
.then(function(result) { 
    // do something 
}) 
.then(function(result) { 
    // do something 
}) 
.catch(function(err) { 
    // handle error 
}); 

Làm thế nào tôi nên viết lại chuỗi lời hứa này theo phong cách RxJS?

Trả lời

42

Đối với luồng dữ liệu (tương đương với then):

Rx.Observable.fromPromise(...) 
    .flatMap(function(result) { 
    // do something 
    }) 
    .flatMap(function(result) { 
    // do something 
    }) 
    .subscribe(function onNext(result) { 
    // end of chain 
    }, function onError(error) { 
    // process the error 
    }); 

Một lời hứa có thể được chuyển đổi thành một thể quan sát được với Rx.Observable.fromPromise.

Một số nhà khai thác lời hứa có bản dịch trực tiếp. Ví dụ: RSVP.all hoặc jQuery.when có thể được thay thế bằng Rx.Observable.forkJoin.

Hãy nhớ rằng bạn có một loạt toán tử cho phép chuyển đổi dữ liệu một cách không đồng bộ và để thực hiện các tác vụ bạn không thể hoặc sẽ rất khó thực hiện với lời hứa. Rxjs cho thấy tất cả các quyền hạn của nó với các chuỗi dữ liệu không đồng bộ (chuỗi có nghĩa là nhiều hơn 1 giá trị không đồng bộ).

Để quản lý lỗi, chủ đề phức tạp hơn một chút.

  • catchfinally khai thác quá
  • retryWhen cũng có thể giúp để lặp lại một chuỗi trong trường hợp lỗi
  • bạn cũng có thể đối phó với sai sót trong các thuê bao riêng của mình với onError chức năng.

Để biết ngữ nghĩa chính xác, hãy xem kỹ tài liệu và ví dụ bạn có thể tìm thấy trên web hoặc đặt câu hỏi cụ thể tại đây.

này chắc chắn sẽ là một điểm khởi đầu tốt cho đi sâu hơn trong việc quản lý lỗi với Rxjs: https://xgrommx.github.io/rx-book/content/getting_started_with_rxjs/creating_and_querying_observable_sequences/error_handling.html

+0

tôi luôn luôn thấy tự quan sát được kết thúc với đăng ký(). Vì đây chỉ là một chức năng của đối tượng quan sát được, có lý do nào để làm điều này không? Có chức năng bắt đầu chuỗi không? –

+0

chính xác như vậy. Nếu không có người quan sát nào đi qua đăng ký, bạn có thể quan sát được sẽ không phát ra bất kỳ dữ liệu nào để bạn không thể thấy bất kỳ luồng dữ liệu nào. – user3743222

+5

Tôi khuyên bạn nên xem xét điều này: https://gist.github.com/staltz/868e7e9bc2a7b8c1f754. CNTT có thể ngon miệng hơn là tài liệu chính thức. – user3743222

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