2017-07-19 2 views
0

Je travaille avec Angular2 et une API de repos nodejs. Je dois faire une ou plusieurs requêtes http pour une même tâche, donc j'utilise Observable.forkJoin() pour attendre que tout se termine. Je mappe le résultat avec la méthode d'analyse json, puis je m'abonne à ce résultat mais Je ne peux pas obtenir les propriétés json du résultat comme je le faisais auparavant.Je ne peux pas gérer les fichiers json retournés par Observable.forkJoin()

Ma méthode de service renvoie la Observable.forkJoin() lui-même:

public rename(file:MyFile, newName:string){ 
    let requests = new Array(); 
    for(let i=0; i<file.sources.length; i++){ 
     let url:string = this.serverUrl; 
     if(src.name === "src1"){ 
      url += "rename/src1"; 
     } else if (src.name === "src2"){ 
      url += "rename/src2"; 
     } 
     requests[i] = this.http.get(url) 
        .map((res:Response) => res.json()) 
        .catch(this.handleError); 
    } 
    return Observable.forkJoin(requests); 
} 

Je souscris dans une autre méthode ailleurs:

this.api.rename(this.selectedFile, newFileName).subscribe(
    rep => { 
     // The editor tells me "Property 'name' doesn't exist on type '{}'." 
     console.log(rep[0].name); 
    }, 
    err => { console.error(err); } 
); 

Le serveur répondre correctement avec les données que j'ai demandé . Le rep [0] est correctement défini, il ressemble à ceci:

Object {name: "res.png", id: "HyrBvB6H-", size: 0, type: "", isShared: false…} 

Je suppose que c'est un problème de frappe. Habituellement, avec une requête http.get simple, il retourne un objet 'any'. Ici, il retourne un objet '[] {}'. res[0] est un objet '{}' et je ne peux pas obtenir les propriétés json dessus. Est-ce que j'utilise correctement Observer.forkJoin() correctement? Est-ce que je manque quelque chose?

Merci à l'avance pour l'aide :)

+0

Que faire si vous faites 'new Array ();'? – jonrsharpe

Répondre

1

Si l'éditeur est plaint et il est pas une erreur lorsque le code est exécuté, il est probablement un problème de frappe. Vous pouvez définir le type de retour de rename() à:

public rename(file:MyFile, newName:string): Observable<any[]> { } 

Cela devrait vous permettre d'accéder aux propriétés des résultats internes tels que name.

Ou vous pouvez taper le tableau rep dans subscribe() comme any[]:

this.api.rename(this.selectedFile, newFileName).subscribe(
    (rep: any[]) => { 
     console.log(rep[0].name); 
    }, 
    err => { console.error(err); } 
); 

Si tout le reste échoue ou ne fonctionne pas pour votre solution, vous pouvez utiliser pour traiter type Assertion rep comme any[]:

this.api.rename(this.selectedFile, newFileName).subscribe(
    rep => { 
     const responses = rep as any as any[]; 
     console.log(responses[0].name); 
    }, 
    err => { console.error(err); } 
); 

Si la structure des résultats est cohérente entre les différents points de terminaison, il est recommandé de créer une interface/classe pour remplacer any[] par.

Espérons que cela aide!

+0

Je me sens stupide, je viens d'ajouter le type de retour Observable sur la méthode et il a immédiatement fonctionné bien. Je pensais que ce ne serait pas nécessaire à cause du «tout». Merci! – Kapcash

1

http.get est un processus asynchrone, donc vous ne pouvez pas utiliser pour la boucle.
Syntaxiquement, vous devez imbriquer les gets dans forkJoin, donc vous avez quelque chose comme ça. Vous pouvez utiliser la boucle pour construire un tableau de urls premier .:

return Observable.forkJoin([ 
    this.http.get(url[1]).map(res => res.json()), 
    this.http.get(url[2]).map(res => res.json()), 
    this.http.get(url[3]).map(res => res.json()) 
    ]) 
    .map((data: any[]) => { 
    this.part1 = data[0]; 
    this.part2 = data[1]; 
    this.part3 = data[2]; 
    }); 

Je me demande si vous pourriez être en mesure de faire quelque chose comme ça. Je vais essayer demain. Il est en retard ..

return Observable.forkJoin(let req = []; 
    for(let i=0; i<file.sources.length; i++){ 
     req[i] = this.http.get(url[i]).map(res => res.json()) 
    } 
) 
+2

Notez qu'avec cette dernière version de tsc (2.4.1) et angulaire (4.3.0), vous devez * supprimer * la notation de tableau pour '.forkJoin()': https://stackoverflow.com/questions/45020250/observable -forkjoin-ts2322-erreur-après-mise-à-jour-vers-typescript-2-4-1-et-rxjs-5 – msanford

+0

Oh ... cela semble prometteur alors .. Alors peut-être que la boucle for cal peut être imbriquée sans le tableau req I était l'attribution .. – JGFMK

+1

Merci d'avoir répondu :) Le problème était purement sur le type d'objets. Je vais supprimer la notation de tableau en fonction de ce que vous avez indiqué @msanford – Kapcash