0

I have an array of objects with a single property

userProps = [
  {
    userId: '1'
  },
  {
    userId: '2'
  },
  {
    userId: '3'
  },
  {
    userId: '4'
  }
];

now I want to map this array and convert it into a new array, assigning in each iteration the response of consuming the api https://jsonplaceholder.typicode.com/users/{userId}

I have tried something like this:

const newUsersProps = this.userProps.map((user) => this.http.get(`https://jsonplaceholder.typicode.com/users/${user.userId}`));
    console.log(newUsersProps);

and would expect a response like this:

newUsersProps = [
  {
    "id": 1,
    "name": "Leanne Graham",
    "username": "Bret",
    "email": "[email protected]",
    "address": {
      "street": "Kulas Light",
      "suite": "Apt. 556",
      "city": "Gwenborough",
      "zipcode": "92998-3874",
      "geo": {
        "lat": "-37.3159",
        "lng": "81.1496"
      }
    },
    "phone": "1-770-736-8031 x56442",
    "website": "hildegard.org",
    "company": {
      "name": "Romaguera-Crona",
      "catchPhrase": "Multi-layered client-server neural-net",
      "bs": "harness real-time e-markets"
    }
  },
  {
    "id": 2,
    "name": "Ervin Howell",
    "username": "Antonette",
    "email": "[email protected]",
    "address": {
      "street": "Victor Plains",
      "suite": "Suite 879",
      "city": "Wisokyburgh",
      "zipcode": "90566-7771",
      "geo": {
        "lat": "-43.9509",
        "lng": "-34.4618"
      }
    },
    "phone": "010-692-6593 x09125",
    "website": "anastasia.net",
    "company": {
      "name": "Deckow-Crist",
      "catchPhrase": "Proactive didactic contingency",
      "bs": "synergize scalable supply-chains"
    }
  },
  {
    "id": 3,
    "name": "Clementine Bauch",
    "username": "Samantha",
    "email": "[email protected]",
    "address": {
      "street": "Douglas Extension",
      "suite": "Suite 847",
      "city": "McKenziehaven",
      "zipcode": "59590-4157",
      "geo": {
        "lat": "-68.6102",
        "lng": "-47.0653"
      }
    },
    "phone": "1-463-123-4447",
    "website": "ramiro.info",
    "company": {
      "name": "Romaguera-Jacobson",
      "catchPhrase": "Face to face bifurcated interface",
      "bs": "e-enable strategic applications"
    }
  },
  {
    "id": 4,
    "name": "Patricia Lebsack",
    "username": "Karianne",
    "email": "[email protected]",
    "address": {
      "street": "Hoeger Mall",
      "suite": "Apt. 692",
      "city": "South Elvis",
      "zipcode": "53919-4257",
      "geo": {
        "lat": "29.4572",
        "lng": "-164.2990"
      }
    },
    "phone": "493-170-9623 x156",
    "website": "kale.biz",
    "company": {
      "name": "Robel-Corkery",
      "catchPhrase": "Multi-tiered zero tolerance productivity",
      "bs": "transition cutting-edge web services"
    }
  }
];

but, I got:

[Observable, Observable, Observable, Observable]

I have also tried to use rxjs

const newUsersProps = of(this.userProps).pipe(
      map((users) => users.map((user) => this.http.get(`https://jsonplaceholder.typicode.com/users/${user.userId}`)),
      tap((res) => console.log('response', res))
    ));

but I still can't.

2

1 Answer 1

4

what you're looking for is the forkJoin operator. here's how u use it:

const newUsersProps = forkJoin(this.userProps
.map(user => this.http.get(`https://jsonplaceholder.typicode.com/users/${user.userId}`))
.subscribe(console.log)

what the forkJoin operator does under the hood is take an array of observables, wait till everyone has completed, then merge their result into a single observable

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.