RXJS:条件映射或mergeMap

时间:2018-08-09 00:41:45

标签: rxjs

如果我有一个方法有时会返回一个字符串,有时会返回一个产生字符串的promise,该如何将其链接到我的可观察对象中?

示例

function doSomething() {
    if (Math.random() < 0.5) {
        return 'test';
    }

    return new Promise(resolve => resolve('test'));
}

const example = of(undefined).pipe(
    mergeMap(() => doSomething())
);

const subscribe = example.subscribe(val => console.log(val));

我想始终登录“测试”。

2 个答案:

答案 0 :(得分:1)

解决问题的一种方法是使传递给mergeMap的函数成为async函数,并传递给await的{​​{1}}的返回值,如下所示:< / p>

doSomething

之所以可以这样做,是因为const example = of(undefined).pipe( mergeMap(async () => await doSomething()) ); 希望函数返回一个mergeMap,并且Promise是有效的ObservableInput

这样做是利用ObservableInput会接受诺言或普通值的事实-await函数返回的诺言将解析为该值。

答案 1 :(得分:0)

function doSomething() {
    if (Math.random() < 0.5) {
        return 'test';
    }

    return new Promise(resolve => resolve('test'));
}

const example = of(undefined)
  .pipe(
    map(() => doSomething()),
    mergeMap(value => value instanceof Promise ? from(value) : from([value]))
  );

const subscribe = example.subscribe(val => console.log(val));

不是您所问的,但是您的代码是反模式。在您的情况下,您的doSomething方法应始终返回相同的值类型,即字符串或Promise。