Created
June 28, 2019 16:54
-
-
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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