Adicione uma promessa para cada item do array a um `Promise.all ()`

0
Voto

Eu tenho o seguinte código onde itero por uma lista com nomes e uso cada nome para buscar, neste caso, a respectiva casa. Isso funciona bem, mas quero incluir todas as promessas de um Promise.all() -como posso adicionar dinamicamente uma promessa para cada nome a um Promise.all()? Qual é a boa prática aqui?

Eu tenho o código a seguir, onde itero por uma lista com nomes e uso cada nome para buscar, neste caso, a respectiva casa. Isso funciona bem, mas eu quero incluir todas as promessas para um Promise.all() Promise.all () -como posso adicionar dinamicamente uma Promise para cada nome a um Promise.all() Promise.all ()? O que é uma boa prática aqui?
list=[
  'Name1',
  'Name2',
  'Name3'
];

this.houses=new BehaviorSubject<any>([]);

const promises=this.greatHouses.map(name=> {
  let house;
  return this.fetchHouse(name).then((result: any[])=> {
    house=result[0];
    return result[0];
  }).then((result: any)=> {
    return this.fetchLord(result.currentLord);
  }).then((result: any)=> {
    const currentLord=Characters.default.find(char=> char.characterName===result.name);
    return [{...house, currentLord}];
  });
});

Promise.all(promises).then(values=> {
  console.log(values);
});

fetchHouse(name: string) {
  return this.http.get(`${this.housesUrl}`, {
    params: {
      name
    }
  }).toPromise();
}

fetchLord(url: string) {
  return this.http.get(url).toPromise();
}
list=[ 'Name1', 'Name2', 'Name3' ]; this.houses=new BehaviorSubject<any>([]); const promises=this.greatHouses.map(name=> { let house; return this.fetchHouse(name).then((result: any[])=> { house=result[0]; return result[0]; }).then((result: any)=> { return this.fetchLord(result.currentLord); }).then((result: any)=> { const currentLord=Characters.default.find(char=> char.characterName===result.name); return [{...house, currentLord}]; }); }); Promise.all(promises).then(values=> { console.log(values); }); fetchHouse(name: string) { return this.http.get(`${this.housesUrl}`, { params: { name } }).toPromise(); } fetchLord(url: string) { return this.http.get(url).toPromise(); } lista=[ 'Nome1', 'Nome2', 'Name3' ]; this.houses=novo BehaviorSubject([]); const promises=this.greatHouses.map (name=>{ deixar casa; retornar this.fetchHouse (nome) .então ((resultado: qualquer[])=>{ casa=resultado[0]; resultado de retorno[0]; }). então ((resultado: qualquer)=>{ retornar this.fetchLord (result.currentLord); }). então ((resultado: qualquer)=>{ const currentLord=Characters.default.find (char=>char.characterName===result.name); return[{... casa, currentLord}]; }); }); Promise.all (promessas) .então (valores=>{ console.log (valores); }); fetchHouse (nome: string) { retornar this.http.get (`${this.housesUrl}`, { params: { nome } }).prometer(); } fetchLord (url: string) { retornar this.http.get (url) .toPromise (); }

Fonte

promise javascript typescript angular rxjs

1 -Bergi

1 -Jaromanda X

1 -Bergi

-Tom

-Bergi

-Tom

1 -Bergi

-Tom

1 -Bergi

1 Responda
0
Voto

Não use promessas de jeito nenhum. Só funcione com Observables se estiver usando Angular e seu HttpClient.

greatHouses=[
  'Name1',
  'Name2',
  'Name3'
];

// Construct and array of Observables that fetch your data
const houses$=this.greatHouses.map(name=> 
  this.fetchHouse(name).pipe(
    // map result to house
    map((result: any[])=> result[0]),
    // map house to an Observable that fetches the lord and return the required data
    switchMap((house: any)=> this.fetchLord(house.currentLord).pipe(
      // map lord to house with currentLord
      map((lord: any)=> {
        const currentLord=Characters.default.find(char=> char.characterName===lord.name);
        return { ...house, currentLord };
      })
    ))
  )
);

// Combine an array of completing Observables with forkJoin to one Observable
forkJoin(houses$).subscribe(houses=> console.log('houses', houses))

// Return Observables and handle errors with `catchError` directly where they occur.
fetchHouse(name: string) {
  return this.http.get(`${this.housesUrl}`, {
    params: {
      name
    }
  }).pipe(
    catchError(error=> {
      console.error('fetchHouse failed', error);
      return of(null);
    })
  );
}

fetchLord(url: string) {
  return this.http.get(url).pipe(
    catchError(error=> {
      console.error('fetchLord failed', error);
      return of(null);
    })
  );
}
Fonte

Você pode interessar

© 2021   OlaMundo.Org