To prevent writing a certain amount of code, such as this example:
...
public getDataSet() : Observable<any>
{
return new Observable(observer => {
if (this.dataset === undefined) {
this.get().subscribe(data => {
this.dataset = new DataSet(data) ;
observer.next(this.dataset)
observer.complete() ;
}) ;
}
else {
observer.next(this.dataset)
observer.complete() ;
}
}) ;
}
I would like to use async/await feature but still return an Observable to remain consistent in using asynchronous data gathering services.
Thus according to RxJs's documentation, I should be using from()
operator. https://www.learnrxjs.io/learn-rxjs/operators/creation/from
Here is what I try to implement (which looks much more concise) :
import { Observable, from } from 'rxjs' ;
...
return from(async () => { // ✘ error
if (this.dataset === undefined) this.dataset = new DataSet(await this.get().toPromise()) ;
return this.dataset ;
}) ;
However, TypeScript doesn't recognize async () => {}
as an ObservableInput
, but it does recognize this one :
import { Observable, from } from 'rxjs' ;
...
return from(new Promise((resolve) => { // ✔ valid
if (this.dataset === undefined) {
this.get().toPromise().then(data => {
this.dataset = new DataSet(data) ;
resolve(this.dataset) ;
}) ;
}
else resolve(this.dataset) ;
})) ;
Though, JavaScript's async
keyword makes a function always return a Promise.
console.log((async () => {}) ())
// Promise {}
Is there a way to make the from()
RxJs operator accepting async promises ?
Async function returns a promise when called, before that it's just a function.
function fromAsyncFunction(): Observable<number> {
return from((async () => {
return 1;
})()); // Call it
}
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments