Aggiungi una promessa per ogni elemento dell'array a `Promise.all ()`

0
Vote

Ho il seguente codice in cui scorro un elenco con i nomi e utilizzo ogni nome per recuperare in questo caso la rispettiva casa. Funziona bene, ma voglio includere tutte le promesse a Promise.all() -come posso aggiungere dinamicamente una promessa per ogni nome a un Promise.all()? Qual è la buona pratica qui?

Ho il seguente codice in cui itero un elenco con i nomi e uso ogni nome per recuperare in questo caso la rispettiva casa. Funziona bene, ma voglio includere tutte le promesse a Promise.all() Promise.all () -come posso aggiungere dinamicamente una promessa per ogni nome a Promise.all() Promise.all ()? Qual è la buona pratica qui?
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(); } list=[ "Nome1", "Nome2", "Nome3" ]; this.houses=new BehaviorSubject([]); const promises=this.greatHouses.map (name=>{ lasciare casa; restituire this.fetchHouse (name) .then ((result: any[])=>{ casa=risultato[0]; risultato di ritorno[0]; }). quindi ((risultato: qualsiasi)=>{ restituire this.fetchLord (result.currentLord); }). quindi ((risultato: qualsiasi)=>{ const currentLord=Characters.default.find (char=>char.characterName===result.name); return[{... house, currentLord}]; }); }); Promise.all (promises) .then (values ​​=>{ console.log (valori); }); fetchHouse (name: string) { return this.http.get (`${this.housesUrl}`, { params: { nome } }).promettere(); } fetchLord (url: string) { restituisci this.http.get (url) .toPromise (); }

Source

promise javascript typescript angular rxjs

1 -Bergi

1 -Jaromanda X

1 -Bergi

-Tom

-Bergi

-Tom

1 -Bergi

-Tom

1 -Bergi

1 Answer
0
Vote

Non utilizzare affatto Promises. Lavora con Observables solo se utilizzi Angular e il suo 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);
    })
  );
}
Source

Potreste essere interessati

© 2021   Risposta.org