Вызов асинхронной функции, но синхронный возврат результата - PullRequest
0 голосов
/ 13 мая 2019

Я хочу создать функцию, которая создает и возвращает 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 ]

2 голосов
/ 13 мая 2019

Есть ли способ решить эту проблему?

Поскольку вы возвращаете 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 голос
/ 13 мая 2019

Превратите обещание в наблюдаемое:

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

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

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