2016-08-31 20 views
6

Tôi có hai đối tượng RxJS, giả sử ab mà tôi cần kết hợp bằng cách nào đó.Kết hợp hai luồng RxJS (dựa trên đồng bộ)

someComboOfAandB.subscribe({aVal, bVal} => console.log("value:", aVal, bVal)); 

Tôi muốn kết hợp chúng như vậy mà nếu ab được cập nhật đồng bộ, các giá trị được giao với nhau:

a.next(1); 
// some code 
b.next(2) 

// at end of synchronous code/frame: 
// value: 1 2 

Tuy nhiên, nếu chỉ là một giá trị được cập nhật, một bản cập nhật sẽ vẫn được đẩy đồng thời cập nhật với hai giá trị mới sẽ được đẩy:

a.next(5) 

// at end of synchronous code/frame: 
// value: 5 2 

Điều này có thể không? Nếu có, thì sao? Ngay cả khi nó có thể, nó là cái gì đó nên tránh?

+0

'combineLatest'? –

+0

http://reactivex.io/documentation/operators/combinelatest.html –

+0

@LukaJacobowitz Vấn đề là hai bản cập nhật sẽ được kích hoạt trong ví dụ đầu tiên ở trên, mà tôi không thể có. – JKillian

Trả lời

2

Bạn sẽ có thể sử dụng một Scheduler để thực hiện hành vi mà bạn muốn:

import "rxjs/add/observable/combineLatest"; 
import "rxjs/add/operator/map"; 

import { BehaviorSubject } from "rxjs/BehaviorSubject"; 
import { Observable } from "rxjs/Observable"; 
import { asap } from "rxjs/scheduler/asap"; 

let a = new BehaviorSubject(1); 
let b = new BehaviorSubject(2); 
let combined = Observable 
    .combineLatest(a, b, asap) 
    .map((values) => ({ aVal: values[0], bVal: values[1] })); 

combined.subscribe(
    ({ aVal, bVal }) => { console.log("value:", aVal, bVal); } 
); 

a.next(3); 
b.next(4); 

Đoạn mã trên sẽ đưa ra như sau:

value: 3 4 

Nếu asapScheduler không được xác định, sản lượng sẽ là:

value: 1 2 
value: 3 2 
value: 3 4 

RxJS GitHub repo chứa một số Scheduler documentation.

+0

Theo tài liệu, 'asap'" Lịch biểu trên hàng đợi tác vụ vi mô, sử dụng cơ chế truyền tải nhanh nhất có sẵn, hoặc ... Web Worker MessageChannel hoặc setTimeout hoặc những người khác. " Điều này nghe có vẻ rất hứa hẹn, tôi sẽ thử nó vào ngày mai – JKillian

+0

Đã thử điều này trong mã của tôi, và thú vị 'asap' không hoạt động, nhưng 'async' đã làm. Tôi đoán tôi không rõ ràng về sự khác biệt giữa hai điều này trong bối cảnh của một trình duyệt là – JKillian

+0

Hmm, điều này thật bực bội - đôi khi có vẻ như nó hoạt động, đôi khi nó không xảy ra. Tôi có một vị trí trong cơ sở mã của tôi về cơ bản như sau: 'log (" start "); a.next (1); log ("mid"); b.next (2); 'Và tôi nhận được' "bắt đầu", "cập nhật đăng ký", "giữa", nơi người đăng ký nhận được bản cập nhật đồng bộ với 'a.next'. trước khi 'b.next' được gọi. Lần khác nó hoạt động mặc dù:/ – JKillian

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