J'ai un tableau d'objets à partir duquel je dois passer chaque objet séparément en méthode asynchrone (le processus derrière est géré avec Promise puis reconverti en Observable via Observable.fromPromise(...)
- ceci Il est nécessaire d'utiliser cette méthode car la même méthode est utilisée dans le cas où un seul objet est transmis à tout moment, le processus enregistre les objets dans la base de données. Par exemple, voici un tableau d'objets:RxJS Mapper un tableau pour observer et retourner à un objet simple dans un tableau
[
{
"name": "John",
...
},
{
"name": "Anna",
...
},
{
"name": "Joe",,
...
},
{
"name": "Alexandra",
...
},
...
]
Maintenant, j'ai la méthode appelée insert which
qui insère dans la base de données objet. La méthode store
de l'instance de base de données renvoie l'ID nouvellement créé. A la fin, l'objet initial est copié et mappé avec son nouvel identifiant:
insert(user: User): Observable<User> {
return Observable.fromPromise(this.database.store(user)).map(
id => {
let storedUser = Object.assign({}, user);
storedUser.id = id;
return storedUser;
}
);
}
Cela fonctionne bien dans le cas où j'insère un objet unique. Cependant, je voudrais ajouter le support pour l'insertion de plusieurs objets qui appellent simplement la méthode pour une insertion simple. À l'heure actuelle c'est ce que j'ai, mais il ne fonctionne pas:
insertAll(users: User[]): Observable<User[]> {
return Observable.forkJoin(
users.map(user => this.insert(user))
);
}
La méthode insertAll
est l'insertion d'utilisateurs comme prévu (ou quelque chose d'autre a rempli la base de données avec les utilisateurs que), mais je ne reçois pas de réponse retour de celui-ci. Je déboguais ce qui se passe et semble que forkJoin
obtient la réponse juste du premier utilisateur mappé, mais d'autres sont ignorés. Abonnement à insertAll
ne fait rien, aussi il n'y a pas d'erreur, soit par l'intermédiaire de catch sur insertAll
ou via le deuxième paramètre de souscrire à insertAll
.
Je suis à la recherche d'une solution où le Observable (en insertAll
) émettraient retour un tableau de nouveaux objets avec les utilisateurs sous cette forme:
[
{
"id": 1,
"name": "John",
...
},
{
"id": 2,
"name": "Anna",
...
},
{
"id": 3,
"name": "Joe",,
...
},
{
"id": 4,
"name": "Alexandra",
...
},
...
]
Je serais très heureux pour toute suggestion pointant dans la bonne direction. Merci d'avance!
ne vois aucune erreur évidente. Il semble que seule la première promesse se résout. Êtes-vous sûr que la base de données supporte plusieurs promesses concurrentes? Que se passe-t-il si vous l'essayez simplement avec des promesses et «Promise.all»?(De plus, dans votre premier extrait de code, vous créez un 'storedUser', mais renvoyez' user' au lieu de 'storedUser'.) – cartant
Merci pour cette suggestion, heureusement, il n'y a pas de problème avec les promesses concurrentes. Il y avait une faute de frappe dans cet exemple que j'ai corrigé maintenant. – user1257255