2017-08-15 1 views
0

Quelle est la meilleure approche pour transformer un tableau et appeler quelques méthodes observables à l'intérieur.Méthode asynchrone observable dans une méthode de carte

Ce que je cherche est quelque chose de ce type de travail:

resultArray = someArray.map(item => { 
     oneObs.subscribe(result1 => { 
      item.result1 = result1 
     }); 
     secondObs.subscribe(result2 => { 
      item.result2 = result2 
     }); 
    }); 

Quelle est la meilleure approche ici? Je suis venu seulement avec une solution de contournement pour utiliser la boucle forEach de ce genre:

someArray.forEach(item => { 
     Observable.forkJoin([oneObs, secondObs]).subscribe(
     (results: [Result1Type, Result2Type]) => { 
      item.result1 = results[0]; 
      item.result2 = results[1]; 
      resultArray.push(item); 
     }); 
    }); 

Toute aide appréciée.

Répondre

2

Vous essayez de mélanger du code synchrone et asynchrone, ce qui peut conduire à un comportement étrange. Ma recommandation serait de convertir le tableau à une observable (rendant le asynchrone tableau) obtenir les résultats et la conversion du résultat complet à un tableau nouveau:

Observable.from(someArray) // 1 
    .mergeMap(item => Observable.forkJoin(oneObs, twoObs) 
      .map(results => { 
       item.result1 = results[0]; 
       item.result2 = results[1]; 
       return item; 
      })) 
    .toArray() // 2 
    .subscribe(arr => resultArray = arr); 
  1. Créer une observable basée sur le tableau
  2. Attendre la fin de toutes les observables et créer un tableau avec toutes les valeurs résultantes