Как flatMap выполняет код синхронно? - PullRequest
0 голосов
/ 13 января 2019

Я сейчас использую flatMap, потому что он может обрабатывать асинхронный код синхронно (как один за другим со значениями из предыдущего результата), но я не знаю, как это происходит. Документация, похоже, не объясняет, что это поведение является частью оператора.

На RxJS документ flatMap определяется как:

Проецирует каждое исходное значение в Observable, который объединен в Выход Наблюдаемый.

Мне нужно обработать комбинацию кода observable, promise и synchronous в моей трубе. В большинстве случаев данные по конвейеру зависят от предшественника:

from(
  // asyncrhonously fetch data from server
  fetchDataAsync(credentials) // returns an Observable
).pipe(
  flatMap((data) => {
    // process the data with a promise
    return from(processDataAsync(data))
  }),
  flatMap((data) => {
    // sanitize the data with synchronous fn
    return of(sanitizeDataSync(data))
  }),
  flatMap((data) => {
    // store the data in local storage with a promise
    return from(storeDataAsync(data))
  })
)

flatMap работает, но я не знаю, как и почему. Как я могу найти это поведение в других операторах?


По сути, я хочу воспользоваться наблюдаемыми потоками, которые работают как ваша обычная асинхронная функция. Что такое RX-way этого?

async function fn() {
  // asyncrhonously fetch data from server
  const fetched = await fetchDataAsync(credentials).toPromise()
  // process the data with a promise
  const processed = await processDataAsync(fetched)
  // sanitize the data with synchronous fn
  const santized = sanitizeDataSync(processed)
  // store the data in local storage with a promise
  return await storeDataAsync(santized)
}

1 Ответ

0 голосов
/ 13 января 2019

Оператор flatMap не выполняет код синхронно: каждый раз, когда он получает событие типа Observable, он подписывается на него и выдает свои события в том же возвращаемом Observable. Кстати, он был переименован в mergeMap в самых последних версиях, что лучше описывает его поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...