2017-07-09 20 views
0

これは、非同期操作を使用する関数ではreturn文を使用できないか、または間違って使用している可能性があることを知りました。私は、その場所で関数を呼び出してreturn文を使用するのではなく、私がつかんでいるデータを使用したい場所で観測可能なものを購読するだけでいいという考えです。は、Observableを使用する関数でreturnステートメントを使用できません

これは私のコードなので、私はreturn文を使う必要がないので、より良いやり方をすることができます。私は約束ではなく、私はもはや約束の価値を見ていない、オブザーバブルを使用したいと思います。

ありがとうございます。

getService(url) { 
    var value: any[] = []; 
    this.http.get(url) 
     .map(
     (response: Response) => { 
      const data = response.json() 
      .subscribe(
       (mappedData: any[]) => value = mappedData, 
       (error) => console.log(error) 
      ) 
       } 
    ); 
    return value; 
    } 
+0

のgetService()午前そう? – mperle

+0

@mperleはい私はコールオブザーバーに申し込みました。次に、observableのサブスクライブされた部分で見ることができるように、変数値をjsonレスポンスに設定します。次に、関数内でその応答を返そうとします。しかし、私はそれがないと言われた –

答えて

0

私の理解から:

getService(url) { 
    var value: any[] = [];       // (1) 
    this.http.get(url)        // (2) 
     .map(response => response.json())   // (3) 
     .subscribe(         // (4) 
      mappedData => value = mappedData.data, // (5) 
      (error) => console.log(error)    // (6) 
    ); 
    return value;         // (7) 
} 

getService()関数が呼び出され...

  • 1行目が実行され、設定した値は空の配列へ。

  • 行2が実行され、Http get操作が実行され、Observableが設定されます。

  • 行7が実行され、空の配列が返されます。 AT SOME

応答がサーバから返された後の時点、...

  • 3行目は、JSONオブジェクトへの応答をマッピングし、サブスクライブ方法

    にそれを提供する実行します
  • 行5は、mappedDataのdataプロパティにローカル値プロパティを割り当てて実行します。外部関数は既にそのプロパティを返しています...結果の値は何も行われません。

これは私がこのコードを理解する方法です。私が間違っているなら、私を修正してください。

前の回答で参照ドキュメントは、実際にこのようなコードを示しています

角度サービスではHeroServiceと呼ばれる:これは観察可能...ではないプロパティを返していることを

getHeroes(): Observable<Hero[]> { 
    return this.http.get(this.heroesUrl) 
        .map(this.extractData) 
        .catch(this.handleError); 
    } 

は注意してください。そして、コンポーネント内の呼び出し元のコードは、メソッド購読含まれていること:HeroComponentと呼ばれる角度成分で

を..呼び出し側にJSONオブジェクトから値を返す必要があり

getHeroes() { 
    this.heroService.getHeroes() 
        .subscribe(
        heroes => this.heroes = heroes, 
        error => this.errorMessage = <any>error); 
} 
+0

私の参照を確認させてください、私たちが観察可能なものを返すと、httpコールはサブスクリプションを必要とするため実行されません。これは、私たちが別のコンポーネントでコールを購読できるかどうか疑問に思う。 –

+0

はい。最後の2つのコードがどこにあるかを特定するために私の答えを強化します。 – DeborahK

+0

これはちょっと嫌なことだけが意味を成しています。私は、さまざまなタイプのコールを返すので、私はメソッドのサイトを取得することができません。私は期待されるデータを別のサービスデータではなく受け取りますそれはまさに私が非常に似ている様々なオブザーバブルを作り出さなければならないということです。これは乾燥しているのですが、...私は、それを締約者のデザインパットーンで解決できると確信しています。 IDKはまだ私はあなたのこの答えが行く方法だと思う! –

0

この方法でjsonオブジェクトの値を返すことができます。

getService(url) { 
var value: any[] = []; 
var subscription = this.http.get(url) 
        .map(response => response.json()) 
        .subscribe(
         mappedData => value = mappedData.data, 
         (error) => console.log(error) 
        ); 
return value; } 
  1. 形質JSONオブジェクト
  2. 最後に加入データからvalueを設定されている.MAPの出力()に次いで.map()
  3. .subscribe()を使用してJSONオブジェクトにhttp.get()から応答を変換します..値を返す

もっとよく分かるようにangular documentationをご覧くださいanding。

+0

私はいくつかの訂正で何をしたか。これは私にこのようにして(堂々と)叫んだ男が間違っていることを私に伝えます。私はこの費用でいくつかの楽しみを持っているように見えるあなたに感謝Homie! –

+0

これはどのように機能しますか?返された値は常に空の配列ではありませんか?これはちょうど私には正しいように見えません。それは実際に働いていますか? – DeborahK

+0

私はそれが動作しないことが正直であることを試みたhaventそれを試みることができたが、それを設定し、テストが時間枠のために長くなる方法である@DeborahKを成就しようとしている方法あなたはこれをどう扱うだろうか? –

0
getService(url) { 
var value: any[] = []; 
var subscription = this.http.get(url) 
        .map(response => response.json()) 
    subscription.subscribe(
       mappedData => value = mappedData.data, 
       (error) => console.log(error) 
       ); 
       return value; } 
+0

いいえ。これは上記の不正なコードのリファクタリングに過ぎません。値はまだ空です。しかし、私はあなたの最善の策はそれを試すことだと思います。私はここにいくつかの操作コードを設定しています:https://github.com/DeborahK/Angular2-GettingStartedこれらのオプションを試してみるために、getProductsメソッドをここの例に変更するだけです。 – DeborahK

+0

私はちょうどあなたのソリューションをテストしてうまく働いてみました。私は私のサイトのアーキテクチャを少し変えなければならないが、それは大丈夫だ。あなたの解決策は素晴らしいです。ありがとう、私はgithubであなたのコードを見ても、私はあなたがすべての問題を通過していただきありがとう –

関連する問題