2017-02-09 5 views
0

Promise.resolve()と同等のものは何もありません(値を決めることは重要です)?Promise.resolve()と同等のRxJS

rxjs alternative to doing a Promise.resolve?と同様の質問があります。

私たちはデータを提供してもうまく動作しますが、価値がないためわからない値を与えないとうまくいかないので、.subscribe()は起動されません。

ionic2アプリのAngular2サービスでは、PromiseベースのサービスをObservablesに移行しようとしています。デバイスがオフラインの場合は、シーケンスのいくつかのステップをスキップする必要があります。約束で、私は順番にエラーを投げて、後でそれをキャッチした

return this.connectivityService.isOnline() 
    .flatMap((isOnline: boolean) => { 
    if (isOnline) { 
     return Promise.resolve(); // work as expected, subscribe() is called 
    } else { 
     return Observable.throw(new OfflineError('The device is offline.')); 
    } 
    }) 
    .do(() => console.log('Do things here')); 

次のコードはしていません:

return this.connectivityService.isOnline() 
    .flatMap((isOnline: boolean) => { 
    if (isOnline) { 
     return Observable.of(); // subscribe() is not called 
    } else { 
     return Observable.throw(new OfflineError('The device is offline.')); 
    } 
    }) 
    .do(() => console.log('Do things here')); 

それは観測と同じことを達成することは可能ですか?私が観察可能なものを使用していないかどうかは自由に感じてください。これは私にとって新しいものです。直接的な方法で質問に答えるために

+0

は、ダミーデータを返すようにしてみてください。 ' return Observable.of(1); ' –

+0

@TiepPhan' Observable.of(1) 'を返すとimhoは動作しますが、これは実行可能な解決策よりもハックです。 – bgondy

+1

'Observable.of(undefined)'は完全に同等です。 – estus

答えて

1

Promise.resolve()の同等

Observable.of(undefined)だろう - が、通常、あなたは、このような回避策を回避することができます。

コードを簡略化しましたか?あなたのケースでは、あなたが実際にここflatMapを使用する必要はありませんので、あなたはまた、単に直接エラーをスローする可能性:

return this.connectivityService.isOnline() 
    .do((isOnline: boolean) => { 
    if (!isOnline) { 
     throw new OfflineError('The device is offline.'); 
    } 
    }) 
    .do(() => console.log('Do things here')); 

const isOnline$ = new Rx.BehaviorSubject(false); // some online-check-service-mock 
 

 
isOnline$ 
 
    .do(isOnline => { 
 
    if (!isOnline) { 
 
     throw new Error("You are offline!"); 
 
    } 
 
    }) 
 
    .do(() => console.log('Do things here')) 
 
    .subscribe(
 
    console.log, 
 
    error => console.error("Oops! ", error.message), 
 
    console.info 
 
);
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

+0

はい、コードスニペットが簡素化されています。オンラインでは、リモートAPIからデータを取得してローカルデータベースを更新します。オフラインで利用できるようになります。次に、「オフラインファースト」アプリのコンセプトに従って、ローカルデータベースからデータをフェッチしてレンダリングします(多かれ少なかれ)。 – bgondy

+0

'Observable.of(undefined)'が期待どおりに動作しています。私は特定の演算子を探していたが、私は間違っていた。ありがとうございました! – bgondy

+0

さて、実際には、追加された 'flatMap'でオンラインのときに、物事を取り出すことができます。ここで' Observable.of'の回避策は必要ありません。 – olsn