2017-12-13 28 views
-2

私がconsole.log(this.distances)になると、利用可能ですがメモリには格納されません。どのように私はそれを使用するメモリに格納することができますか?データの後に関数を実行しても、配列のエラーはまだnullになります。観測可能なデータが保持されません

findClosestRiderToUser() { 
    this.fetchAllRiders().subscribe(async distance => {   
     await this.distances.push(distance); 
    }); 
} 

問題:サブスクリプションのthis.distances外を使用しようとしているが動作していない

は、ここに私の関数です。これをどうすれば解決できますか?

+0

関数の一部が非同期の場合、全体が非同期でなければなりません。あなたのコードを少しをフォーマットし、あなたがしようとしたところにconsole.log – Isaac

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise – Isaac

+0

非同期/のawaitれている米国を表示非同期データを処理する1つの方法では、オブザーバブルは別のものであり、混同しないでください。 – bryan60

答えて

1

観測は、一般的に非同期であるため、データが到着する前に、第2のラインが実行されるため

obs$.subscribe(data => this.data = data); 
console.log(this.data); 

は多くまたはほとんどのケースでは動作しません。あなたは、関数内でこの呼び出しを持っているだけの機能から、観察を返し、呼び出し側から購読したい場合はどのようなあなたの代わりにやりたいことは

obs$.subscribe(data => { 
    this.data = data; 
    console.log(this.data); 
}); 

です:

function getData() { return obs$; } 
getData().subscribe(...); 

rxjs多くのオペレータが付属していますあなたが観察可能なものをさらに結合したり、チェーンしたり、操作したりすることを可能にします。この方法では完全に非同期になり、awaitを使用してコードの実行をブロックする必要はありません。あなたは絶対にをブロック化したいなら

、あなたは

const data = await obs$.toPromise(); 

を使用することができますしかし、あなたは試してみて、代わりにそれの上にあなたが得る最初のチャンスをブレー​​キをかけるの反応パターンで動作するはずです。単一の値ではなく、一連のデータを出力する観測可能なパワーを失います。

+0

すばらしいです!別の問題は、3つのオブジェクトを含む1つの配列を取得する代わりに発生していることです。代わりに3つの配列を取得しています。ソースコード:https://codepen.io/anon/pen/NXPOWe –

+0

これがあなたの質問に答えた場合は、緑色のチェックマークで回答を受け入れたものとしてマークしてください。新しい質問については、関連するコードを直接投稿できる新しいスレッドを開きます。 –

+0

@oluwaseunpaul答えがあなたの問題を解決した場合には、それをマークしてください。 –

関連する問題