Fetching user information along with user posts in Angular
Here is my code with 2 services, one is messageService
which is used to get user messages:
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { environment } from 'src/environments/environment';
import 'rxjs/add/operator/retry';
import 'rxjs/add/operator/catch';
import { handleError } from '../common/error-handler';
@Injectable({
providedIn: 'root'
})
export class MessagesService {
private _config = environment;
constructor(private http: HttpClient) { }
getMessages() {
return this.http.get(`${this._config.apiUrl}/messages`)
.retry(3)
.map(data => (data && data['messages']) || )
.catch(handleError);
}
}
And the other is usersService
which is used to get user information based on user_id
:
import { HttpClient } from '@angular/common/http';
import { environment } from 'src/environments/environment';
import { Injectable } from '@angular/core';
import { handleError } from '../common/error-handler';
@Injectable({
providedIn: 'root'
})
export class UsersService {
private _config = environment;
constructor(private http: HttpClient) { }
getUser(user_id) {
return this.http.get(`${this._config.apiUrl}/users/${user_id}/public_profile`)
.retry(3)
.map(data => data || {})
.catch(handleError);
}
}
And in the constructor of my component:
@Component({
selector: 'wall',
templateUrl: './wall.component.html',
styleUrls: ['./wall.component.css']
})
export class WallComponent {
constructor(private messageService: MessagesService,
private usersService: UsersService) {
this.messageService.getMessages()
.switchMap(response => {
let resArray: any = response.map(
post => {
return Observable.zip(
this.usersService.getUser(post.user_id),
Observable.of(post)
);
});
return Observable.merge(...resArray)
}).switchMap(res => {
res[1]['user'] = res[0];
this.messages.push(res[1]);
return Observable.of(res[1]);
})
.subscribe(final_post => {
console.log('final post:', final_post)
})
}
}
The question is how should I get user messages using Observable
and then getting users information for each message (each message may have different user information), then merging them into one object which finally will be used in the desired component with fewer Observable
pipelines? I suppose using merge
and then again switchMap
to merge these data is not optimal and best practice.
typescript angular-2+ rxjs
New contributor
This question has an open bounty worth +50
reputation from ALH ending in 6 days.
This question has not received enough attention.
add a comment |
Here is my code with 2 services, one is messageService
which is used to get user messages:
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { environment } from 'src/environments/environment';
import 'rxjs/add/operator/retry';
import 'rxjs/add/operator/catch';
import { handleError } from '../common/error-handler';
@Injectable({
providedIn: 'root'
})
export class MessagesService {
private _config = environment;
constructor(private http: HttpClient) { }
getMessages() {
return this.http.get(`${this._config.apiUrl}/messages`)
.retry(3)
.map(data => (data && data['messages']) || )
.catch(handleError);
}
}
And the other is usersService
which is used to get user information based on user_id
:
import { HttpClient } from '@angular/common/http';
import { environment } from 'src/environments/environment';
import { Injectable } from '@angular/core';
import { handleError } from '../common/error-handler';
@Injectable({
providedIn: 'root'
})
export class UsersService {
private _config = environment;
constructor(private http: HttpClient) { }
getUser(user_id) {
return this.http.get(`${this._config.apiUrl}/users/${user_id}/public_profile`)
.retry(3)
.map(data => data || {})
.catch(handleError);
}
}
And in the constructor of my component:
@Component({
selector: 'wall',
templateUrl: './wall.component.html',
styleUrls: ['./wall.component.css']
})
export class WallComponent {
constructor(private messageService: MessagesService,
private usersService: UsersService) {
this.messageService.getMessages()
.switchMap(response => {
let resArray: any = response.map(
post => {
return Observable.zip(
this.usersService.getUser(post.user_id),
Observable.of(post)
);
});
return Observable.merge(...resArray)
}).switchMap(res => {
res[1]['user'] = res[0];
this.messages.push(res[1]);
return Observable.of(res[1]);
})
.subscribe(final_post => {
console.log('final post:', final_post)
})
}
}
The question is how should I get user messages using Observable
and then getting users information for each message (each message may have different user information), then merging them into one object which finally will be used in the desired component with fewer Observable
pipelines? I suppose using merge
and then again switchMap
to merge these data is not optimal and best practice.
typescript angular-2+ rxjs
New contributor
This question has an open bounty worth +50
reputation from ALH ending in 6 days.
This question has not received enough attention.
add a comment |
Here is my code with 2 services, one is messageService
which is used to get user messages:
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { environment } from 'src/environments/environment';
import 'rxjs/add/operator/retry';
import 'rxjs/add/operator/catch';
import { handleError } from '../common/error-handler';
@Injectable({
providedIn: 'root'
})
export class MessagesService {
private _config = environment;
constructor(private http: HttpClient) { }
getMessages() {
return this.http.get(`${this._config.apiUrl}/messages`)
.retry(3)
.map(data => (data && data['messages']) || )
.catch(handleError);
}
}
And the other is usersService
which is used to get user information based on user_id
:
import { HttpClient } from '@angular/common/http';
import { environment } from 'src/environments/environment';
import { Injectable } from '@angular/core';
import { handleError } from '../common/error-handler';
@Injectable({
providedIn: 'root'
})
export class UsersService {
private _config = environment;
constructor(private http: HttpClient) { }
getUser(user_id) {
return this.http.get(`${this._config.apiUrl}/users/${user_id}/public_profile`)
.retry(3)
.map(data => data || {})
.catch(handleError);
}
}
And in the constructor of my component:
@Component({
selector: 'wall',
templateUrl: './wall.component.html',
styleUrls: ['./wall.component.css']
})
export class WallComponent {
constructor(private messageService: MessagesService,
private usersService: UsersService) {
this.messageService.getMessages()
.switchMap(response => {
let resArray: any = response.map(
post => {
return Observable.zip(
this.usersService.getUser(post.user_id),
Observable.of(post)
);
});
return Observable.merge(...resArray)
}).switchMap(res => {
res[1]['user'] = res[0];
this.messages.push(res[1]);
return Observable.of(res[1]);
})
.subscribe(final_post => {
console.log('final post:', final_post)
})
}
}
The question is how should I get user messages using Observable
and then getting users information for each message (each message may have different user information), then merging them into one object which finally will be used in the desired component with fewer Observable
pipelines? I suppose using merge
and then again switchMap
to merge these data is not optimal and best practice.
typescript angular-2+ rxjs
New contributor
Here is my code with 2 services, one is messageService
which is used to get user messages:
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { environment } from 'src/environments/environment';
import 'rxjs/add/operator/retry';
import 'rxjs/add/operator/catch';
import { handleError } from '../common/error-handler';
@Injectable({
providedIn: 'root'
})
export class MessagesService {
private _config = environment;
constructor(private http: HttpClient) { }
getMessages() {
return this.http.get(`${this._config.apiUrl}/messages`)
.retry(3)
.map(data => (data && data['messages']) || )
.catch(handleError);
}
}
And the other is usersService
which is used to get user information based on user_id
:
import { HttpClient } from '@angular/common/http';
import { environment } from 'src/environments/environment';
import { Injectable } from '@angular/core';
import { handleError } from '../common/error-handler';
@Injectable({
providedIn: 'root'
})
export class UsersService {
private _config = environment;
constructor(private http: HttpClient) { }
getUser(user_id) {
return this.http.get(`${this._config.apiUrl}/users/${user_id}/public_profile`)
.retry(3)
.map(data => data || {})
.catch(handleError);
}
}
And in the constructor of my component:
@Component({
selector: 'wall',
templateUrl: './wall.component.html',
styleUrls: ['./wall.component.css']
})
export class WallComponent {
constructor(private messageService: MessagesService,
private usersService: UsersService) {
this.messageService.getMessages()
.switchMap(response => {
let resArray: any = response.map(
post => {
return Observable.zip(
this.usersService.getUser(post.user_id),
Observable.of(post)
);
});
return Observable.merge(...resArray)
}).switchMap(res => {
res[1]['user'] = res[0];
this.messages.push(res[1]);
return Observable.of(res[1]);
})
.subscribe(final_post => {
console.log('final post:', final_post)
})
}
}
The question is how should I get user messages using Observable
and then getting users information for each message (each message may have different user information), then merging them into one object which finally will be used in the desired component with fewer Observable
pipelines? I suppose using merge
and then again switchMap
to merge these data is not optimal and best practice.
typescript angular-2+ rxjs
typescript angular-2+ rxjs
New contributor
New contributor
edited 19 hours ago
New contributor
asked Dec 26 '18 at 13:22
ALH
614
614
New contributor
New contributor
This question has an open bounty worth +50
reputation from ALH ending in 6 days.
This question has not received enough attention.
This question has an open bounty worth +50
reputation from ALH ending in 6 days.
This question has not received enough attention.
add a comment |
add a comment |
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "196"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
ALH is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210358%2ffetching-user-information-along-with-user-posts-in-angular%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
ALH is a new contributor. Be nice, and check out our Code of Conduct.
ALH is a new contributor. Be nice, and check out our Code of Conduct.
ALH is a new contributor. Be nice, and check out our Code of Conduct.
ALH is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210358%2ffetching-user-information-along-with-user-posts-in-angular%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown