2017-02-06 7 views
2

私はBehaviorSubject<number>sの2次元配列を持っています。デバッグの目的のために、私はすべての配列セルが値を出すとすぐにフォーマットされた方法で値を書きたいと思っています。だから私はこれを書いた:ソースが配列として与えられている場合、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()であるのか分からないけど、今それだけでzip()をcallls。 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で場所を取るにもかかわらず、Observable配列を認識しません[email protected] Observable.zip()関数の実装のよう

+0

ご連絡ありがとうございます。 univerの定義はこれです: 'let universe:BehaviorSubject [] []'。誤った引数に関するコンパイルエラーや実行時エラーはありません。 apply()やcall()を使って私のニーズを満たすことを試みます。 – koducu

+0

私はこれをzip.d.ts: 'export declare function zipStatic (配列:ObservableInput []):Observable ' – koducu

+0

@koducuで見つけました。実際には、ここで見られるように 'zipProto'だけ心配する必要があります。 /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

私のタイプ/ Javascriptの知識を超えています)。渡された引数オブジェクトのメンバをローカルの配列にポンピングし、配列を渡すとそれらを平らにすることはありません。また、状況を上げるためにパラメータの型をチェックすることさえありません。

上記の@ martinの回答を受け取った後、私はObservable.zip()に電話を変更してObservable.zip.apply(null, observable_array)とし、問題は解決しました。しかし、.zip()は、可読性を助け、前述の関数宣言に従うために、Observableの配列(少なくとも1つ)を受け入れる必要があります。

関連する問題