2016-10-13 1 views
1

Я не могу объяснить себе этоRxjs отчетливые и массивы чисел

const something = new Rx.BehaviorSubject([1,2,4,4]) 
.distinct() 
.do((s) => console.log(s)) 
.map(list => list.length) 
.filter(length => length >=2) 
.subscribe(total => console.log('total:', total)); 

это то, что я получаю в качестве выходного

[1, 2, 4, 4] 
"total:" 
4 

я запутаться, потому что пересмотр документации на отчетливый я думал, что это будет работать для чисел. Мой пример использования - это виджет таблицы данных, который отправляет мне события, и этот массив отслеживает, какую строку они нажали, и я хочу обнаружить, как только дважды щелкнул.

обновленный код

const something = new Rx.BehaviorSubject([]); 

something.next ([1]); console.log (something.getValue()); something.next (something.getValue(). Concat (2)); something.next (something.getValue(). Concat (3)); something.next (something.getValue(). Concat (4)); something.next (something.getValue(). Concat (4));

.distinct() .subscribe (val => console.log ('значение:', val));

выход

"value:" 
[1, 2, 3, 4, 4] 
+0

У вас есть поток одного массива (не поток чисел), отличный от одного массива является тот же массив :) –

+0

OH Я могу принять это как ответ, что делает смысл – Barry

+0

@OlesSavluk, что относительно обновленного фрагмента, который я разместил выше? – Barry

ответ

2

Вы посылаете значение, которое случается быть массивом. Вы бы видели операцию отличимым, если вы сделали

const something = new Rx.BehaviorSubject([]); 
something .distinct() .subscribe(val => console.log('value:', val)); 
something.next(1); // --> value: 1 
something.next(2); // --> value: 2 
something.next(1); // no output (because of distinct) 
something.next(3); // --> value: 3 
+0

Как вы можете найти, когда отправляется дублирующее значение, и сохраняя знание о том, какие идентификаторы были отправлены. Или это не то, что я должен делать с rx? Я написал то, что хотел выполнить в простых js, но теперь просто любопытно, возможно ли это и как это сделать. Скажем, отправлено в 1,2,4,6,2 ... тогда вы бы знали, что 2 дублируется – Barry

+0

@Barry звучит так, как будто вы хотите создать операцию, противоположную '' 'distinct''''. Конечно, это возможно - просто начните с кода для '' 'distinct''' (https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/distinct.js) и инвертировать, когда он отправляет. В частности, [эта строка] (https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/distinct.js#L50) становится '' '! this._h.push (key) && this._o.onNext (x); '' '(« когда ключ IS в хэше I -ve-seen-this-value, отправьте его ».) – frankleonrose

+0

@Barry Of Конечно, вы хотите использовать Rx только тогда, когда вы смотрите на поток значений с течением времени. Вы настроили подписки и обработчики, чтобы делать что-то в будущем со значениями, которые вы еще не видели. Если вы знаете свой набор значений прямо сейчас, вам не нужен Rx. Например, используя UnderscoreJS, '' '_.groupBy (mylist, _.identity) .filter (function (g) {return g.length> 1;}). Flatten(). Uniq()' '' – frankleonrose

 Смежные вопросы

  • Нет связанных вопросов^_^