RxJS: Làm thế nào để tôi có thể cập nhật thủ công một cách quan sát?


139

Tôi nghĩ rằng tôi phải hiểu sai một cái gì đó cơ bản, bởi vì trong suy nghĩ của tôi đây là trường hợp cơ bản nhất cho một người có thể quan sát được, nhưng đối với cuộc sống của tôi, tôi không thể tìm ra cách làm nó từ các tài liệu.

Về cơ bản, tôi muốn có thể làm điều này:

// create a dummy observable, which I would update manually
var eventObservable = rx.Observable.create(function(observer){});
var observer = eventObservable.subscribe(
   function(x){
     console.log('next: ' + x);
   }
...
var my_function = function(){
  eventObservable.push('foo'); 
  //'push' adds an event to the datastream, the observer gets it and prints 
  // next: foo
}

Nhưng tôi đã không thể tìm thấy một phương pháp như thế nào push. Tôi đang sử dụng công cụ này cho trình xử lý nhấp chuột và tôi biết họ có Observable.fromEventđiều đó, nhưng tôi đang cố gắng sử dụng nó với React và tôi chỉ có thể cập nhật kho dữ liệu trong một cuộc gọi lại, thay vì sử dụng hoàn toàn khác hệ thống xử lý sự kiện. Vì vậy, về cơ bản tôi muốn điều này:

$( "#target" ).click(function(e) {
  eventObservable.push(e.target.text()); 
});

Gần nhất tôi có được sử dụng observer.onNext('foo'), nhưng điều đó dường như không thực sự hoạt động và điều đó được gọi là người quan sát, điều đó dường như không đúng. Người quan sát nên là thứ phản ứng với luồng dữ liệu, không thay đổi nó, phải không?

Tôi chỉ không hiểu mối quan hệ quan sát / quan sát?


Hãy xem điều này để làm rõ ý tưởng của bạn (Giới thiệu về Lập trình phản ứng mà bạn đã bỏ lỡ): gist.github.com/staltz/868e7e9bc2a7b8c1f754 . Ở đây cũng có một loạt các tài nguyên mà bạn có thể cải thiện sự hiểu biết của mình: github.com/Reactive-Extensions/RxJS#resource
user3743222

Tôi đã kiểm tra đầu tiên, có vẻ như là một tài nguyên vững chắc. Cái thứ hai là một danh sách tuyệt vời, trên đó tôi tìm thấy aaronstacy.com/writings/reactive-programming-and-mvc giúp tôi khám phá Rx.Subject, giải quyết vấn đề của tôi. Vì vậy, cảm ơn! Khi tôi đã viết thêm một chút ứng dụng, tôi sẽ đăng giải pháp của mình, chỉ muốn chiến đấu thử nghiệm nó một chút.
LiamD

Hehe, cảm ơn bạn rất nhiều vì đã hỏi câu hỏi này, tôi đã định đặt câu hỏi tương tự với mẫu mã rất giống nhau trong tâm trí :-)
arturh

Câu trả lời:


154

Trong RX, Observer và Observable là các thực thể riêng biệt. Một người quan sát đăng ký vào một Đài quan sát. Một chiếc quan sát phát ra các vật phẩm cho người quan sát bằng cách gọi các phương thức của người quan sát. Nếu bạn cần gọi các phương thức quan sát ngoài phạm vi Observable.create()bạn có thể sử dụng Chủ thể, đó là một proxy hoạt động như một người quan sát và có thể quan sát cùng một lúc.

Bạn có thể làm như thế này:

var eventStream = new Rx.Subject();

var subscription = eventStream.subscribe(
   function (x) {
        console.log('Next: ' + x);
    },
    function (err) {
        console.log('Error: ' + err);
    },
    function () {
        console.log('Completed');
    });

var my_function = function() {
  eventStream.next('foo'); 
}

Bạn có thể tìm thêm thông tin về các môn học ở đây:


1
Đây thực sự là chính xác những gì tôi làm lên! Tôi tiếp tục làm việc để xem liệu tôi có thể tìm ra cách tốt hơn để làm những gì tôi cần làm không, nhưng đây chắc chắn là một giải pháp khả thi. Tôi đã nhìn thấy nó đầu tiên trong bài viết này: aaronstacy.com/writings/reactive-programming-and-mvc .
LiamD

34

Tôi tin rằng Observable.create()không lấy một người quan sát làm tham số gọi lại mà là một trình phát. Vì vậy, nếu bạn muốn thêm một giá trị mới vào Observable của mình, hãy thử điều này thay vào đó:

var emitter;
var observable = Rx.Observable.create(e => emitter = e);
var observer = {
  next: function(next) {
    console.log(next);
  },
  error: function(error) {
    console.log(error);
  },
  complete: function() {
    console.log("done");
  }
}
observable.subscribe(observer);
emitter.next('foo');
emitter.next('bar');
emitter.next('baz');
emitter.complete();

//console output
//"foo"
//"bar"
//"baz"
//"done"

Có Chủ đề giúp dễ dàng hơn, cung cấp Người quan sát và Người quan sát trong cùng một đối tượng, nhưng nó không hoàn toàn giống nhau, vì Chủ đề cho phép bạn đăng ký nhiều người quan sát đến cùng một quan sát khi một người quan sát chỉ gửi dữ liệu đến người quan sát được đăng ký cuối cùng, vì vậy hãy sử dụng nó một cách có ý thức . Đây là một JsBin nếu bạn muốn sửa đổi nó.


khả năng ghi đè tài sản bộ phát được ghi lại ở đâu đó trong hướng dẫn sử dụng RxJS?
Tomas

Trong trường hợp emitternày sẽ chỉ next()các giá trị mới cho người quan sát đã đăng ký cuối cùng. Một cách tiếp cận tốt hơn sẽ là thu thập tất cả các emitters trong một mảng và lặp đi lặp lại tất cả chúng và nextgiá trị trên mỗi chúng
Eric Gopak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.