2017-07-19 14 views
0

私はAngular2とnodejs rest APIを使っています。私はObservable.forkJoin()を使ってそれらのすべてが終了するのを待っているので、同じタスクのために1つ以上のhttpリクエストを行う必要があります。 結果をjson構文解析メソッドでマップしてからこの結果にサブスクライブしますが、以前のように結果からjsonプロパティを取得できません。Observable.forkJoin()によって返されたjsonファイルを処理できません。

マイサービスメソッドはObservable.forkJoin()自体を返します。

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); 
} 

その後、私は別の場所で別の方法でそれを購読する:

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); } 
); 

サーバーが正しく、私は尋ねたデータで応答します。 [0]が正しく設定されている担当者は、それは次のようになります。

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

私はそれがタイピングの問題だと仮定します。通常、単純なhttp.get要求では、 'any'オブジェクトを返します。ここで '[] {}'オブジェクトを返します。 res[0]は '{}'オブジェクトで、jsonプロパティを取得できません。

Observer.forkJoin()を正しく使用していますか?何か不足していますか?助けを事前に

感謝:)

+0

'new array ();'を実行するとどうなりますか? – jonrsharpe

答えて

1

Ifは文句エディタであり、それはないコードが実行されるとエラーになり、それはおそらくタイピングの問題があります。これは、あなたがそのようなnameとしてインナー結果のプロパティにアクセスできるようにする必要があり

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

:あなたはにrename()の戻り値の型を設定することができます。

それとも、any[]としてsubscribe()rep配列を入力することができます。他のすべてが失敗したか、あなたがany[]としてrepを治療するためのタイプアサーションを使用することができますあなたのソリューションのために動作しない場合

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

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

結果の構造が異なるエンドポイント間で一貫している場合は、any[]を置き換えるインターフェイス/クラスを作成することをお勧めします。

うまくいけば助けてください!

+0

私は愚かな気がします、私はちょうど戻り値の型Observable メソッドに追加し、すぐにうまくいきました。 私はそれは「any」のために必要ではないでしょう。ありがとう! – Kapcash

1

http.getは非同期プロセスなので、forループは使用できません。
構文的には、forkJoin内にgetsをネストする必要があります。あなたは最初のURLの配列を構築するためのforループを使用することができます。:

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]; 
    }); 

あなたはこのような何かを行うことができるかもしれません場合、私は疑問に思います。私は明日試してみるよ。遅くなりました。

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

'.forkJoin()'の配列表記を削除するには、最新のtsc(2.4.1)と角度(4.3.0)を使用する必要があります:https://stackoverflow.com/questions/45020250/observable -forkjoin-ts2322-errors-after-updating-typescript-2-4-1-and-rxjs-5 – msanford

+0

ああ...それで有望だと思う..おそらくforループループはreq配列なしでネストされます。 .. – JGFMK

+1

応答ありがとう:) :)問題は純粋にオブジェクトの種類でした。 @msanfordを指摘した通りに配列表記を削除します – Kapcash

関連する問題