2017-02-18 25 views
1

Так в Rxjs, у меня есть куча кода,Как собрать массив испущенных значений из Observable.from?

return Observable.from(input_array) 
      .concatMap((item)=>{ 
       //this part emits an Observable.of<string> for each item in the input_array 
      }) 
      .scan((output_array:string[],each_item_output_array:string)=>{ 
       return output_array.push(each_item_output_array) ; 
      }); 

Но, видимо, это не так, то сканирование будет взломать код внутри concatMap, так что я хочу знать, как собрать выходной массив для каждого элемента наблюдаемый оператор from?

+0

Что вы имеете в виду выдает строку? Функция 'project', переданная в [' concatMap'] (http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-concatMap), должна вернуть наблюдаемое, обещание или массив - не строка. – cartant

+0

@cartant, это Observable of string, на самом деле это строка, конечно же, и наблюдаемая. –

+0

На самом деле, я беру это обратно - вы можете вернуть строку. 'concatMap' будет перебирать его и испускать отдельные символы. – cartant

ответ

5

В вашем запросе на scan вы не указали семя для аккумулятора. В этом случае первое значение используется как семя. Например:

Rx.Observable 
 
    .from(["a", "b", "c"]) 
 
    .scan((acc, value) => acc + value) 
 
    .subscribe(value => console.log(value));
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

В вашем фрагменте первое значение не является массивом, так что вы не можете назвать push на нем. Для того, чтобы накапливать значения в массив, вы можете указать семя массив как это:

Rx.Observable 
 
    .from(["a", "b", "c"]) 
 
    .concatMap(value => Rx.Observable.of(value)) 
 
    .scan((acc, value) => { 
 
    acc.push(value); 
 
    return acc; 
 
    }, []) // Note that an empty array is use as the seed 
 
    .subscribe(value => console.log(value));
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

Обратите внимание, что scan выделяет массив для каждого значения, которое он получает. Если вы хотите только один массив, излучаемого, когда наблюдаемый завершается, вы можете использовать оператор toArray вместо:

Rx.Observable 
 
    .from(["a", "b", "c"]) 
 
    .concatMap(value => Rx.Observable.of(value)) 
 
    .toArray() 
 
    .subscribe(value => console.log(value));
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

+1

toArray, спасибо огромное –

+0

Если бы я мог это сделать сто раз. toArray решила проблему, над которой я работал весь день. Спасибо! –

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

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