2017-09-05 17 views
4

関数を作成してオブザーバブルを返すのに少し助けが必要です。私は関数を持っています(それをmainFunctionと呼ぶ)、それは非同期関数を呼び出して(それをgetAsyncWithCallbackと呼ぶ)、コールバックを実行します。コールバックの一部は、オブザーバブルを返す非同期コールです(getDataとしましょう)。RxJS Merge Observable in Callback

getAsyncWithCallbackはライブラリの一部です。変更することはできません。

これは私が持っているものです。

mainFunction(){ 
    getAsyncWithCallback(() => { 
     let myObservable = getData(); 
    }); 
} 

これは私が何をしたいです:

mainFunction().subscribe((data) => { 
    // data is the data from getData() 
}); 

最高これを達成するための方法、およびエラーでチェーンおよび完了形は何ですか内部?

+0

「myObservable」を返さない(またはどこかに割り当てる)場合、私はあなたができることはあまりないと思います。 – acdcjunior

+0

私はあなたが約束を使用してそれをobservableに変換できると確信しています。私はあなたに例を提供するIDE atmを持っていません。 – MistyK

+0

コールバックは変更可能なコードです。私はそこに 'myObservable'を定義しました。 – Grey

答えて

1

私の解決策:

mainFunction(): Observable<any> { 

    return Rx.Observable.create(observer => { 
     getAsyncWithCallback((): void => { 
      getData().subscribe(observer); 
     }) 
    }) 
} 

mainFunction().subscribe((data) => { 
    console.log(data); 
})); 
+0

これは、 'getData'が' Observable'を返すので、オブザーバブルのオブザーバブルを作成します。私はどこかで 'mergeMap/flatMap'を投げる必要があると思います。 – Pace

+0

私はそれを観測可能なものに戻すように変更しました。なぜ、マージまたはフラットマップが好きですか? – Rex

+1

@Paceのように演算子を使用する代わりに 'getData()。subscribe(observer)'を書く方が良いと思います。 –

0

あなたはmainFunctionから観察可能に返すことになるでしょう。 getDataが観測ないオブジェクトの他のいくつかのタイプを返す場合、あなたはObservable.createを使用して独自の観測を構築します

function mainFunction() { 
    return Observable.create((obs) => { 
    getAsyncWithCallback(() => { 
     getData() 
     .subscribe((data) => { obs.next(data); }) 
     .catch((err) => { obs.error(err) }); 
    }); 
    }); 
} 

mainFunction().subscribe(data => console.log(data)); 

ドキュメントから:

がにonSubscription機能を変換作成実際のObservable。誰かがObservableに登録すると、その関数はObserverインスタンスを最初の唯一のパラメータとして呼び出されます

値を指定してnextを呼び出すと、その値がオブザーバに送信されます。

ほとんどの場合、既存の演算子はほとんどのユースケースに対してObservableを作成できるため、createを使用する必要はありません。それは、非常に具体的なニーズがある場合、Observableを作成できる低レベルのメカニズムです。

配列、配列のようなオブジェクト、イテレータ、Observableのようなオブジェクトと約束からObservablesを作成するObservable.fromもあります。

+0

'getAsyncWithCallback()'を呼び出す必要があるので、最初のオプションはこれを解決しません。第2の選択肢に関しては、それはエラーと完了を連鎖させない。私の質問にこれを追加します。 – Grey

+1

@Greyコールバックの失敗のケースを処理していないあなたの例では、これが何を意味するのか分かりませんが、これは良いスタートになるはずです。また、obs.error()またはobs.complete()観察可能なもののエラーまたは完了。 –

+0

@RudolfOlah '.subscribe'の後に' .catch'を実行することはできません。あなたは完了を送信しません。 @OlesSavluk thx、これをテストする現時点ではコンソールはありません。他の回答のコメントには、「.subscribe(obs)」と書いてください。 –

関連する問題