In software application, screen(s) where to display data application needs to make dependent request i.e. First have to make Request A (to server or database), based on result of A request data have to make Request B.
Example : In shopping application, on product screen , when user select product it will display product details and based on product make region it also display in which region it available or which region it's available.
So achieve in application there is need of dependent request , which works this way
In code most of the developer write below code
code above does the task. But its complex (in terms of readability) and not easy to understand when there is more depedent request are there (if there are more dependent request like Request C , depends on Request B and which depends on Request A) as it goes deep and deep for each request.
Below are some way to avoid complexity and easy to understand code.
RxJs Way
Above example just make use of one RxJs function which subscribe, and does thing in that function only. For second request (dependent request) it does same thing which makes code complex. But RxJS provides number of functions apart of subscribe which make things simple. Below is code how to reduce complexity of above code by making use of other function provided by Rxjs.
this does the same task as above code, but better way. Following functions to not down which makes code easy
Another way to achieve same is make use of advance typescript concept , which making use of async/await. Below is code for the same
Points to note with this approach is:
when method getDetails called from anywhere in code, executing stops when await keyword got encountered, and it waits till getProduct server request returns. Execution get resumed once server returned response which in this case return product. Then it stops execution again on encounter of await, which used to wait till availableResion request retuns.
At the End
So there are two approach
Example : In shopping application, on product screen , when user select product it will display product details and based on product make region it also display in which region it available or which region it's available.
So achieve in application there is need of dependent request , which works this way
- It request (server/database) to get full product detail
- Based on product region , it makes request (server/database) to get available regions
In code most of the developer write below code
this.productService.getProduct(1) .subscribe(data => { this.product = data; this.productService.getAvailableRegion(data.regionId) .subscribe(region => this.avilableRegion = region); });
code above does the task. But its complex (in terms of readability) and not easy to understand when there is more depedent request are there (if there are more dependent request like Request C , depends on Request B and which depends on Request A) as it goes deep and deep for each request.
Below are some way to avoid complexity and easy to understand code.
RxJs Way
Above example just make use of one RxJs function which subscribe, and does thing in that function only. For second request (dependent request) it does same thing which makes code complex. But RxJS provides number of functions apart of subscribe which make things simple. Below is code how to reduce complexity of above code by making use of other function provided by Rxjs.
this.productService.getProduct(id) .pipe( map(data => this.product = data), switchMap (cust => this.productService.getAvailableRegion(this.product.regionId) ) ).subscribe(region => this.avilableRegion = region);
this does the same task as above code, but better way. Following functions to not down which makes code easy
- pipe - its RxJs function which allows number of RxJS function as input and combine them to perform operations one by one on observable received from previous function.
In above code it combines map and switchMap RxJs operator. - map - it used to map returned observable value to other value. In this case it maps returned response to product.
- switchMap - it used for switching from one observable to other observable, in this example it switch from product to list of regions.
- Finally subscribe - this allows to subscribe to response observable stream of provided from pipe function after operation done in it.
Another way to achieve same is make use of advance typescript concept , which making use of async/await. Below is code for the same
async getDetails(id) { this.product = await this.productService.getProduct(id).toPromise(); this.avilableRegion = await this.productService.getAvailableRegion(this.product.Id).toPromise(); }
Points to note with this approach is:
- async/await is used with Promise object only.
- In code, promise object got created from returned observable by making use of toPromise method.
when method getDetails called from anywhere in code, executing stops when await keyword got encountered, and it waits till getProduct server request returns. Execution get resumed once server returned response which in this case return product. Then it stops execution again on encounter of await, which used to wait till availableResion request retuns.
At the End
So there are two approach
- RxJs and
- TypeScript
none of them is better then another one , it all on developer preference. But both the way it makes code simple and easy to understand. It also help developer in maintaining code for long time as not much complexity involved.