2017-02-08 16 views
1

私は、私はしかし、これがすべてで働いて、その方法が、ボイドの機能をキャストするためにされていないforkJoin()void関数はどうですか?例えば

Observable.forkJoin([voidFunction1(), voidFunction2()]).subscribe() ; 

voidFucntion1()voidFunction2()たいか?元のvoidFunction()を変更することなく?

+1

を返し、' observable'する必要があります。.. – Hackerman

+0

私はボイド関数を観測可能にキャストできますか? Observable.of()を使用していますか?それは働くでしょうか? –

+0

これを 'forkJoin()'の例で見てみましょう。もっと多くの例http://stackoverflow.com/questions/42035075/observable-subscription-notgetting-called/42038302#42038302 – martin

答えて

2

まず: I 非常にがそれ以外、あなたはあなたのボイドの機能をリファクタリングないことを示唆している、それはそれがを行っていても、ストリーム内の空隙の機能を使用することが可能に一種でありますまったく意味ない

Rx.Observable.defer(() => { 
 
    voidFunction1(); 
 
    voidFunction1(); 
 
    return Rx.Observable.of("Done"); 
 
}) 
 
.subscribe(console.log); 
 

 
function voidFunction1() { 
 
    console.log("Called VoidFunc"); 
 
    // I'm not enjoyed 
 
    // because I'm void! 
 
}
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

あなたはrxjsにおけるボイドの機能を行うことができる唯一のことは、do演算子はとdefer演算子はあり


は、使用するforkJoin持っ場合: `forkJoin`あなたの機能を使用するために

const voidWrapper$ = wrapVoid(voidFunc); 
 
const voidWrapper2$ = wrapVoid(voidFunc); 
 

 
Rx.Observable.forkJoin(voidWrapper$, voidWrapper2$) 
 
.subscribe(console.log); 
 

 

 
function wrapVoid(func) { 
 
    return Rx.Observable.defer(() => { 
 
    func(); 
 
    return Rx.Observable.of("Done"); 
 
    }) 
 
} 
 

 
function voidFunc() { 
 
    console.log("called voidFunc"); 
 
    // notn' ho! 
 
}
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

+0

もう一度、propbally becozからCのfuntionalプログラミングの背景のように、これらの機能は、スタンドアロンの再利用可能なことを確認してください私はこれを尋ねる。私の視点では、voidでサブスクライブすると、これらのvoidサブプロシージャでジョブが終了することが保証されます。私が反応的なやり方に従えば、私はそうではない傾向があるような、全体の一部のための関数の将来の使用法を考えなければならない。私が間違っている? –

+0

これは間違っています - void関数内で(サブスクリプションのような)非同期の処理がある場合、void内の非同期関数がいつ完了するかを知る方法は全くありません。Obsersevableが実行に影響を与えないのでvoidをラップしますまったく!これを100%確実に知る唯一の方法は、あなたのvoidの内部動作がすべて同期的に実行される場合です... rxjsを使用するのではなく、2つのメソッド呼び出しを単純に書くことができます。非常に同じ結果を持っています。 – olsn

+0

また、関数型プログラミング(これまで遭遇した少なくとも__any__)は、ベストプラクティスとしてvoid関数を宣言しません - void関数は、データの突然変異(悪い)またはステートフルなオブジェクト適切でコンテキストに関係なく、再利用可能な関数は_pure_であり、一連の入力を受け取り、いくつかの計算を行い、その計算結果を出力として返します。これは、どの状態からも独立しています。その入力のいずれも突然変異しない。 – olsn

2

フォークジョインは、コールバック関数を実行する前にすべてのオブザーバブルが解決するまで待機します。

帰ってこない「void」観測結果があれば、forkjoinはハングします。何かを "返す"ことがなくても、それらの関数に解決策を持たせる必要があります。すべての

+0

問題は、通常、これらのボイド関数は書き換えが難しい。 –

+0

あなたのforkjoinに「void関数」があるのはなぜわかりませんか?あなたは精緻化できますか? – chrispy

関連する問題