Rx js Transform API: результат, наблюдаемый другим, наблюдаемым в сервисной функции - PullRequest
1 голос
/ 07 января 2020

У меня есть служба загрузчика, результатом которой является Observable<string>, которая содержит файл CSV. Каждая строка представляет отдельную сущность (например) объекта Person, разделенные запятыми части представляют свойство человека, например, id, возраст, имя и т. Д. c.

Сервисная функция загрузчика:

loadtTextFile(path: string): Observable<string> 

Сервисная функция loadAllPerson:

loadAllPerson(): Observable<Array<Person>> 

Я хотел бы вызвать loadtTextFile в оболочке loadAllPerson, где требуемый вывод: Observable<Array<Person>>

Как я могу гарантировать, что служба вернется только тогда, когда все строки CSV будут проанализированы в результате Observable<Array<Person>>?

Возможно, сначала нужно дождаться результата loader service после анализа это в массив Person и возвращает результат в Observable<Array<Person>>

Следующая часть кода анализирует содержимое в Person Array, где contentObservable является Observable<string>

const contentObservable = this.fileLoaderService.loadtTextFile();

contentObservable.mapTo(fileContent => {
    const rowsOfContent = fileContent.split('\n');
    rowsOfContent.forEach((row: string) => {
      const cols = row.split(',');
      // has valid numeric value of id and age?
      if (!Number.isNaN(+cols[0]) && !Number.isNaN(+cols[3])) {
        const person = new Person(+cols[0], cols[1], cols[2], +cols[3], cols[4],
          cols[5], cols[6], cols[7], new Date(cols[8]));
        personData.push(person);
      }
    });
    console.log(JSON.stringify(personData));
});

1 Ответ

2 голосов
/ 08 января 2020

map оператор твой друг. Попробуйте вот так:

loadAllPerson(): Observable<Person[]> {
  return loadTextFile(PATH).pipe(
    map((csv: string) =>
      csv.split('\n')
         .map((rows: string[]) => rows.map((row: string) => row.split(',')))
         .map((table: string[][]) => 
           table.filter((cols: string[]) => !Number.isNaN(+cols[0]) && !Number.isNaN(+cols[3]))
                .map((cols: string[]) => new Person(+cols[0], cols[1], cols[2], +cols[3], cols[4], cols[5], cols[6], cols[7], new Date(cols[8])))
         )
    )),
  );
}
...