2017-02-06 2 views
2

У меня есть двумерный массив BehaviorSubject<number>s. Для целей отладки я хочу записать значения в отформатированном виде, как только все ячейки массива испускают значение. Поэтому я написал следующее:Observable.zip не вызывает subscribe.next, если источники заданы как массив

Observable.zip(universe.map(row => Observable.zip(row))) 
     .takeUntil(stopper) 
     .subscribe(u => 
      console.log(`[\n\t[${u.map(r => r.toString()).join("],\n\t[")}]\n]`)) 

Ничего не написано. А также это не работает:

Observable.zip(universe[0]) 
     .takeUntil(stopper) 
     .subscribe(u => console.log(`1[${u.toString()}]`)) 

Но эти следующие работы (массив имеет 5 столбцов):

Observable.zip(universe[0][0], universe[0][1], universe[0][2], universe[0][3], universe[0][4]) 
     .takeUntil(stopper) 
     .subscribe(u => console.log(`2[${u.toString()}]`)) 

    Observable.zip(Observable.zip(Observable.zip(Observable.zip(universe[0][0], universe[0][1]), universe[0][2]), universe[0][3]), universe[0][4]) 
     .takeUntil(stopper) 
     .subscribe(u => console.log(`3[${u.toString()}]`)) 

Также я рассмотрел .zipAll (оператор), но нет ни одного документа, об этом ,

Это может быть ошибка в коде Observable.zip(), поскольку она показывает ArrayLike<BehaviorSubject<number>> как возможный тип аргумента в помощи кода.

Так есть ли другой способ получить эту функциональность? Как я могу получить значения массива, записанные после того, как все значения будут переназначены, не зная фактических измерений, конечно?

ответ

2

Важно то, что оператор zip() не принимает массив Observables, а вместо него находится распакованная серия Observables.

Именно поэтому Observable.zip([obs1, obs2, obs3]) не работает.

Но Observable.zip(obs1, obs2, obs3) работ.

Невозможно помочь вам, когда мы не знаем, что такое universe. Из того, что у вас есть сейчас, кажется, что вы могли бы использовать destructuring assignment (при условии, что вы используете ES6 или машинопись):

Observable.zip(...universe[0]); 

Я не знаю, какие планы с zipAll(), но сейчас это просто callls zip().

+0

Благодарим вас за приглашение. Определение для univer следующее: 'let universe: BehaviorSubject [] []'. В отношении неправильного аргумента нет компиляции или ошибок времени выполнения. Я попытаюсь использовать apply() или call(), которые когда-либо удовлетворяют мои потребности. – koducu

+0

Я нашел это в zip.d.ts: 'export declare function zipStatic (array: ObservableInput []): Observable ' – koducu

+0

@koducu На самом деле вы должны беспокоиться только о 'zipProto', как вы можете здесь увидеть https://github.com/ReactiveX/rxjs/blob/master/src/add/operator/zip.ts и здесь https://github.com/ReactiveX/rxjs/blob/master/src/operator/zip.ts # L13 – martin

0

По [email protected] Observable.zip реализации функции() не распознает Observable массивов, даже если export declare function zipStatic<T>(array: ObservableInput<T>[]): Observable<T[]>; и export declare function zipStatic<T>(...observables: Array<ObservableInput<T>>): Observable<T[]>; объявление функций имеет место в rxjs/operator.zip.d.ts (В чем разница между этими декларациями находится за пределами моего знания типа/Javascript). Он просто перекачивает элементы объекта аргумента, переданные ему в локальный массив, и никогда не сглаживает их, если вы передаете массив. И даже не проверяет типы параметров, чтобы поднять ситуацию.

После получения ответа от Мартина, я изменил его на Observable.zip() с Observable.zip.apply(null, observable_array), тогда проблема решена. Но .zip() должен принять (по крайней мере один) массив из Observable s, чтобы облегчить читаемость и придерживаться вышеупомянутых деклараций функций.

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