2017-12-21 3 views
-1

をhttpリクエストし、応答を解釈することを提案してください。応答には、関数内にロードされていないオブジェクトの配列とその配列が含まれます。Typescriptは、関数の外で宣言された配列をロードしません。

Notes:- making http request. 

public getRequest(): void { 
    let bdoNamesArray: BdoName[]; 
    bdoNamesArray = []; 

    this.http.get<BdoName[]>(this.bdoNamesUrl, {observe: 'response', responseType: 'json'}) 
     .subscribe((data: HttpResponse<BdoName[]>) => { 
      let vjyArray: BdoName[]; 
      vjyArray = []; 
      for (let i = 0; i < data.body.length; i++) { 
        const obj = new BdoName(); 
        obj.emplid = data.body[i].emplid; 
        obj.name = data.body[i].name; 
        vjyArray.push(obj); } 
      console.log(vjyArray); // Array loaded from http-response 
      bdoNamesArray.concat(vjyArray); // not loaded 
      }, 
     error => { 
      console.log('error on sub'); 
     }, 
     () => { 
      console.log('sub completed'); 
     } 
    ); 
    console.log(bdoNamesArray); // Emtpy array !! 
} 
+0

問題とドンを教えてください:

public getRequest(): Observable<any> { let bdoNamesArray: BdoName[]; bdoNamesArray = []; let result = this.http.get<BdoName[]>(this.bdoNamesUrl, {observe: 'response', responseType: 'json'}); return result; } 

もう一つの方法は、あなたが別のコールバック関数を持っているかもしれません要求を回避する。 – jhpratt

+1

'bdoNamesArray'は非同期ですが、ネットワークの要求を使って充填していますが、同時に配列を記録しています。だから、データを受け取る前にそれを記録しているので、それは空です。 – CRice

+0

http.get要求の呼び出しが完了した後、コンソールでbdoNamesArrayを記録しています。この時間までに、購読も終了します。私がhttp-responeを取得するとすぐに、vjyArrayがロードされてコンソールに表示されます。私が望んでいたのは、それを別の配列 - bdoNamesArrayにコピーすることでした。 – VJY

答えて

1

最終的にconsole.logを実行しているときは、実行時にアレイが技術的に空であるため、配列は空です。これは、配列を操作するためのコードがの将来のある時点でで実行され、GET要求のサブスクリプションの直後ではないためです。

たとえば、あなたのコードの実行は、このようなものである:イベントがを言うことによって、データthis.http.get<BdoName[]>(this.bdoNamesUrl, {observe: 'response', responseType: 'json'})

  • あなたがこのイベントをサブスクライブをGETするトリガー

    1. let bdoNamesArray: BdoName[]; bdoNamesArray = [];
    2. いつでも自分のデータでこのイベントが戻ります次の操作を実行します。

      let vjyArray: BdoName[]; 
          vjyArray = []; 
          for (let i = 0; i < data.body.length; i++) { 
            const obj = new BdoName(); 
            obj.emplid = data.body[i].emplid; 
            obj.name = data.body[i].name; 
            vjyArray.push(obj); 
      } 
      console.log(vjyArray); 
      // ... 
      
    3. それが続行し、console.log(bdoNamesArray);を実行すると、空の配列であることがわかります。いつか将来、

      :あなたのbdoNamesArrayはロジックによって移入されあなたはあなたのコードが非同期を実行している3

    のでステップに入れ、したがって、あなたはにあなたのロジックを開発する必要があります。その非同期呼び出しのコールバック内で何をしているのかを示します。

    これを解決する1つの方法は、オブザーバブル自体を返し、呼び出し元に結果のロジックを決定させることです。

    例(this.http.getは()に観察を返すと仮定して):

    public getRequest(): void { 
        let bdoNamesArray: BdoName[]; 
        bdoNamesArray = []; 
    
        this.http.get<BdoName[]>(this.bdoNamesUrl, {observe: 'response', responseType: 'json'}) 
         .subscribe((data: HttpResponse<BdoName[]>) => { 
          doStuff(data); 
          }, 
          //... 
    } 
    
  • +0

    更新されたコード行にコメント「// not loaded」をお読みください。 – VJY

    +0

    また、変数がサブスクライブされたイベントの外部にあるため、これを行うことはできません。あなたは、サブスクリプションのコールバック機能内で何をしていても何でもしなければなりません。私が上記で書いた注文を見ると、最後にコンソールにログオンする前に連結は起こりません。 – Parthasus

    +0

    "doStuff"は、あなたが期待している通りに動作しません。私のコメントを読んでください。 – VJY

    関連する問題