Могу ли я наблюдать дополнения к массиву с помощью rx.js?

fromArray Rx wiki на github

coffee> rext = require 'rx'                                                 
coffee> arr = [1..5]                                                 
[ 1, 2, 3, 4, 5 ]                                                    
coffee> obs = rext.Observable.fromArray(arr)                         
{ _subscribe: [Function] }                                           
coffee> obs.subscribe( (x) -> console.log("added value: " + x))      
added value: 1                                                       
added value: 2                                                       
added value: 3                                                       
added value: 4                                                       
added value: 5                                                       
{ isStopped: true,                                                   
  observer:                                                          
   { isStopped: true,                                                
     _onNext: [Function],                                            
     _onError: [Function: defaultError],                             
     _onCompleted: [Function: noop] },                               
  m: { isDisposed: true, current: null } }                           
coffee> arr.push(12)    # expecting "added value: 12"                                              
6                       # instead got new length of array                                              
coffee>          

Похоже, что функция subscribe будет срабатывать только один раз, когда она будет создана. Похоже, что это немного неправильно, поскольку я действительно просто для каждого массива вместо наблюдения за изменениями на нем. Этот код почти точно такой же, как и на вики. Поэтому либо я делаю это неправильно, либо subscribe не работает, как я ожидаю.

Ответ 1

Observable.fromArray создает Observable, который немедленно запускает события для каждого элемента массива, когда вы добавляете подписчика. Таким образом, он не будет "наблюдать" за изменениями в этом массиве.

Если вам нужна "pushable collection", класс Bus в Bacon.js может быть тем, что вы ищете. Для RxJs есть мой маленький MessageQueue класс, который имеет аналогичную функциональность.

Ответ 2

В RxJS то, что вы ищете, называется Subject. Вы можете вставлять в него данные и передавать их оттуда.

Пример:

var array = [];
var arraySubject = new Rx.Subject();

var pushToArray = function (item) {
  array.push(item);
  arraySubject.next(item);
}

// Subscribe to the subject to react to changes
arraySubject.subscribe((item) => console.log(item));

Ответ 3

Я нашел Rx.Observable.ofObjectChanges(obj) для работы так, как я ожидал.

На странице документации:

Создает наблюдаемую последовательность из изменений объекта с помощью Object.observe.

Надеюсь, что это поможет.