【问题标题】:Changing all functions that returns Promise to observable将所有返回 Promise 的函数更改为 observable
【发布时间】:2019-11-21 04:59:52
【问题描述】:

我有一个 API,其中几乎每个函数都返回一个 Promise。我想以被动的方式使用这个 API。对于单个案例,它看起来像这样:

source.pipe(
    mergeMap(action => {
        return defer<[]>(() => API.callThatReturnsAPromise()).pipe(
            map(result => {
                return doFancyStuff(result);
            })
        );
    })
)

假设有很多这样的函数返回一个承诺(有些带有 args,有些没有)。

有没有一种优雅的方法可以在不手动包装 defer 和处理可能的参数的情况下对 observables 做出这些承诺?

提前致谢

【问题讨论】:

    标签: javascript promise rxjs


    【解决方案1】:

    使用自

    source.pipe(
      mergeMap(action => from(API.callThatReturnsAPromise())),
      map(result => doFancyStuff(result))
    )
    

    from 接受一个 Promise 作为输入并返回一个 observable。

    const { of, from, fromEvent } = rxjs;
    const { mergeMap, map } = rxjs.operators;
    
    let source$ = fromEvent(document.getElementById('source'), 'click');
    
    let API = {
      callThatReturnsAPromise: () => new Promise((resolve, reject) => {
        console.log('resolving');
        resolve('done');
      })
    };
    
    const doFancyStuff = val => `Result of promise was: ${val}`;
    
    source$.pipe(
      mergeMap(_ => from(API.callThatReturnsAPromise())),
      map(result => doFancyStuff(result))
    ).subscribe(val => { console.log(val); });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.3/rxjs.umd.min.js"></script>
    <button id="source">Click</button>

    【讨论】:

    • With from 承诺在任何处理程序连接之前已经执行。我不会有这种行为。
    • Promise 在创建时正在执行。在源发出之前,mergeMap 不会触发。查看我添加的可运行的 sn-p。在单击使源发射的按钮之前,可以在不创建承诺的情况下设置可观察链。
    • 调用 API.callThatReturnsAPromise() 会运行 promise,from(API.callThatReturnsAPromise()) 也会运行,否则你怎么能在不创建 promise 的情况下包装它呢?在源发出与您的问题完全相同的行为之前,mergeMap 函数不会创建可观察的包装承诺,因此这正是您想要的。
    • 感谢您澄清这一点!
    【解决方案2】:

    您的问题几乎已经有了答案。

    const toObservable=(promiseFn,mapFn)=>
           defer<[]>(() => promiseFn()).pipe(
                map(result => {
                    return mapFn(result);
                })
            );
    
    
    // usage
       api.get=()=>Promise.resolve('ok')
       mapFn=(value)=>...your map logic
       toObservable(api.get,mapFn).subscribe()
    

    【讨论】:

    • 或者你可以使用 from
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2021-09-21
    • 2017-04-29
    • 2018-05-30
    • 2018-11-25
    • 1970-01-01
    • 2021-12-06
    相关资源
    最近更新 更多