RXJS:条件映射或合并映射

jos*_*unt 6 rxjs

如果我有一个方法有时会返回一个字符串,有时会返回一个导致字符串的承诺,我如何将它链接到我的 observable 中?

例子

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));
Run Code Online (Sandbox Code Playgroud)

我想总是记录“测试”。

car*_*ant 3

解决该问题的一种方法是将函数传递给mergeMap函数async并传递给await的返回值doSomething,如下所示:

const example = of(undefined).pipe(
  mergeMap(async () => await doSomething())
);
Run Code Online (Sandbox Code Playgroud)

您可以这样做,因为mergeMap期望函数返回 anObservableInput并且 Promise 是有效的ObservableInput

这样做利用了这样一个事实:await将接受一个承诺或一个普通值 - 函数返回的承诺async将解析为该值。