javascript - 如何让 Observable.flatMap 等待解析

标签 javascript rxjs ava

在使用 RxJS 和 React 时,我遇到了如何等待另一个 Observable 的 map 中生成的 Observable.fromPromise 中的数据的问题。

我有异步助手:

const dataStreamGenerator = (url = CLIENTS_DATA_URL) => (
  Rx.Observable.fromPromise(fetch(url))
  .flatMap(response => Rx.Observable.fromPromise(response.json()))
  .catch(err => Rx.Observable.of(new Error(err)))
);

然后我有 actions.fetchClients$,它是 Rx.Subject:

actions.fetchClients$.map((url = CLIENTS_DATA_URL) => {
    const ts = Date.now();
    console.log('FETCH CLIENTS with: ', url);
    return dataStreamGenerator(url);
  }).map(val => {
    console.log('GOT DATA IN REDUCER: ', val);
    const error = (val instanceof Error) ? val.message : undefined;
    const data = error ? undefined : val;
    actions.receivedClientsData$.next({ data, error, ts: Date.now() });
    return (state) => state;
  })

(是的,试图在 RxJS 中模仿 Redux)。

当我测试 dataStreamGenerator 时,它工作正常(使用 ava)并传送数据:

test('dataStreamGenerator', t => {
  const ds$ = dataStreamGenerator(CLIENTS_DATA_URL);
  return ds$.do((data) => {
    t.is(data.length, 10);
  });
});

(AVA自动订阅observable并消费,无需订阅)

但是 actions.fetchClients$.map((url = CLI... 第二个映射(开始... console.log('GOT DATA IN REDUCER: ', val) ;... 仍在获取 Observable 而不是来自 dataStream$ 的数据。

我在 fetchClients$ 代码中尝试了所有可能的 mapflatMap 组合,但仍然没有成功。

我的测试代码是:

test.only('fetchClients$', t => {
  const initialState = {};
  actions.fetchClients$.next('http://jsonplaceholder.typicode.com/users');
  reducer$.subscribe(val => {
    console.log('TEST SUBSCRIBE VAL: ', val);
    t.pass();
  });
  actions.fetchClients$.next('http://jsonplaceholder.typicode.com/users');
});

我不知道如何等待 Observable dataStreamGenerator(url); 发出数据而不是 Observable。

谢谢。

最佳答案

您需要展平从 dataStreamGenerator 返回的结果。

actions.fetchClients$
  //This is now a flatMap
  .flatMap((url = CLIENTS_DATA_URL) => {
    const ts = Date.now();
    console.log('FETCH CLIENTS with: ', url);
    return dataStreamGenerator(url);
  });

map 运算符按原样向下游传递值,而 flatMap 将扁平化 ObservablesArraysPromises 这样它们的值就是被传播的。

它在测试用例中有效,因为您直接订阅了 dataStreamGenerator 返回的 Observable

关于javascript - 如何让 Observable.flatMap 等待解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38312768/

相关文章:

javascript - 使用 Object.create(null) 创建的 map 具有 toString 属性

javascript - 应该在这里使用 !important 吗?

angular - 从 setTimeout Observable 方法访问一个值

javascript - 检查是否未完成 Observable 是否为空

javascript - NPM 如何运行不在路径中的命令

javascript - 当用户将计算机置于 sleep 状态时,将用户从网站上注销

javascript - 获取 HTML 注释标签内的文本?

javascript - 重复/重置可观察值

javascript - 仅当所有 ava 测试都通过时才运行命令

javascript - 使用 sinon、nyc 和 ava 测试 js/esm 项目 - 尽管有控制台日志,但在控制台上进行 spy 测试仍失败