Skip to content

Instantly share code, notes, and snippets.

@XoseLluis
Created June 28, 2019 16:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save XoseLluis/78f2c715c4b2bf9dabc7402d7c91520a to your computer and use it in GitHub Desktop.
Save XoseLluis/78f2c715c4b2bf9dabc7402d7c91520a to your computer and use it in GitHub Desktop.
Promises vs Observables comparison for functions returning single data (not a data stream)
import { Observable, Subject, ReplaySubject, from, of, range, observable } from 'rxjs';
import { map, flatMap, filter, concatMap, switchMap, delay, tap } from 'rxjs/operators';
function getUserId(userName:string, callback: (id:number) => void){
let users: { [key: string]: number } = {
anonymous: -1,
francois: 1,
chloe: 2
};
setTimeout(() => callback(users[userName] as number), 2000);
}
function getPermissions(id:number, callback: (permissions:string[]) => void){
let permissions: { [key: number]: string[] } = {
1: ["r", "w"],
2: ["r"]
};
setTimeout(() => callback(permissions[id]), 2000);
}
function observableGetUserId(userName:string): Observable<number>{
return new Observable(observer => getUserId(userName, id => observer.next(id)));
}
function observableGetPermissions(id:number): Observable<string[]>{
return new Observable(observer => getPermissions(id, permissions => observer.next(permissions)));
}
function observablesTest(userName:string){
observableGetUserId(userName).pipe(
flatMap(id => {
console.log("id: " + id);
if (id === -1){
return of([]);
}
else{
return observableGetPermissions(id);
}
})
).subscribe(permissions => console.log("permissions: " + permissions.join(",")));
}
observablesTest("francois");
//observablesTest("anonymous");
function getUserId(userName:string, callback: (id:number) => void){
let users: { [key: string]: number } = {
anonymous: -1,
francois: 1,
chloe: 2
};
setTimeout(() => callback(users[userName] as number), 2000);
}
function getPermissions(id:number, callback: (permissions:string[]) => void){
let permissions: { [key: number]: string[] } = {
1: ["r", "w"],
2: ["r"]
};
setTimeout(() => callback(permissions[id]), 2000);
}
//-------------------------------
function promisifiedGetUserId(userName:string): Promise<number>{
return new Promise(res => getUserId(userName, res));
}
function promisifiedGetPermissions(id:number): Promise<string[]>{
return new Promise(res => getPermissions(id, res));
}
async function promisesTest(userName:string){
let id = await promisifiedGetUserId(userName);
console.log("id: " + id);
let permissions: string[];
if (id === -1){
permissions = [];
}
else{
permissions = await promisifiedGetPermissions(id);
}
console.log("permissions: " + permissions.join(","));
}
//sort of C#'s "async main"
(async () => {
await promisesTest("francois");
await promisesTest("anonymous");
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment