调用异步函数但同步返回结果

时间:2019-05-13 10:19:26

标签: javascript typescript promise rxjs observable

我想构造一个创建并返回Observable的函数。根据函数接收的参数,它应该创建Observable并直接返回它,或者(在特殊情况下)在返回Observable之前调用另一个异步函数。

抽象示例:

async function doSomethingAsync(){
    return 'success';
}

function returnObservable(specialCase: boolean): Observable<any>
    const observable = new Observable(
        observer =>
            observer.next(1)
        }
    );

    if(specialCase) {
        doSomethingAsync().then(
            then => {
                // this does not work, of course, but that's what I would like to be able to do
                return observable;
            }
        )       
    } else {
        return observable;
    }
} 

现在,我的问题是,我似乎无法调用异步函数,然后返回Observable。我可以使整个returnObservable函数异步,而仅使await doSomethingAsync异步,但是returnObservable函数将返回Promise并返回Observable-那不是我想要的此函数的使用者应直接接收Observable。

我希望我能阐明我的问题。有什么办法可以解决这个问题?

2 个答案:

答案 0 :(得分:2)

  

有什么办法可以解决这个问题?

因为您要返回Observable,所以可能有。

returnObservable函数返回之前,不可能async同时阻塞。 但是,您可以让它返回一个Observable,该信号(可选)在异步功能完成之前不会发出任何事件。直到/除非有东西订阅它,您甚至可能甚至不调用异步函数。

隐约可见的东西:

function returnObservable(specialCase: boolean): Observable<any>
    const promise = specialCase ? doSomethingAsync() : Promise.resolve();
    const observable = new Observable(
        observer => {
            promise
            .then(() => {
                observer.next(1);
            })
            .catch(error => {
                // deal with the error
            });
        }
    );

    return observable;
} 

(您甚至可以使用fromPromise。可以肯定的是,我对Rx.js不够了解。)

答案 1 :(得分:1)

将诺言转变为可观察的:

application