2016-09-23 9 views
2

私は、各関数が次の "コールバック"関数に返される値を渡す一連の関数呼び出しを強制的に実行するために、関数がオブザーバブルを返すという規則で作業しています。しかし、チュートリアルを読んだり読んだりすると、私はフラットマップだと思ってこれをもっとうまくやっているように思えます。私は約束で始まっていないが、私はこのアドバイスhttps://stackoverflow.com/a/34701912/2621091に近いと思う。以下に、より良いアプローチに関する助言を得てクリーンアップするのに役立つことを望んでいる例とリストを示しました。私はあなたが提供できる助けのために非常に感謝しています:コールバックhellを観測可能なチェーンに変換する

grandparentFunction().subscribe(grandparentreturnobj => { 

    ... oprate upon grandparentreturnobj ... 

}); 


grandparentFunction() { 

    let _self = this; 

    return Observable.create((observer) => { 

     ... 

     _self.parentFunction().subscribe(parentreturnobj => { 

      ... 

      _self.childFunction(parentreturnobj).subscribe(childreturnobj => { 

       ... 

       observer.next(grandparentreturnobj); 
       observer.complete(); 
      }); 
     }); 
    }); 
} 


parentFunction() { 

    let _self = this; 

    return Observable.create((observer) => { 

     ... 

     observer.next(parentreturnobj); 
     observer.complete(); 
    } 
} 


childFunction() { 

    let _self = this; 

    return Observable.create((observer) => { 

     ... 

     observer.next(childreturnobj); 
     observer.complete(); 
    } 
} 

答えて

1

一般的な経験則RxJSでは、あなたが本当にあなたが知っている限り(すなわち、Observable.create()を使用して)手作り、カスタムの観測を作成しないようにしようとすべきであるということですあなたがやっていること、それを避けることはできません。 RxJSの「契約」をしっかりと把握していないと微妙な問題を引き起こす可能性があるトリッキーなセマンティクスがあるので、既存のObservable作成機能を使用する方が良いでしょう。さらに、既存のObservableで演算子を適用してObservablesを作成し、それを返します。

サンプルコードの具体的な批評では、Observableファンクションチェーンを作成するには、.flatMap()を使用する必要があります。あなたが現在持っているネストされたObservable.create()はRxのようなものではなく、同じ問題「コールバック・ヘル・スタイル」のコードに苦しんでいます。

あなたの例と同じことをする例がありますが、もっと慣用的なRxスタイルです。 doStuff()は私たちが作成したい非同期関数です。 doStuff()は、非同期関数step1()を呼び出して、その結果を非同期関数step2()にチェーンし、結果に対してさらに演算を行い、最終結果をdoStuff()の呼び出し元に返します。

function doStuff(thingToMake) { 
    return step1(thingToMake) 
     .flatMap((step1Result) => step2(step1Result)) 
     .map((step2Result) => { 
      let doStuffResult = `${step2Result}, and then we're done`; 
      // ... 
      return doStuffResult; 
     }); 
} 

function step1(thingToMake) { 
    let result = `To make a ${thingToMake}, first we do step 1`; 
    // ... 
    return Rx.Observable.of(result); 
} 

function step2(prevSteps) { 
    let result = `${prevSteps}, then we do step 2` 
    // ... 
    return Rx.Observable.of(result); 
} 

doStuff('chain').subscribe(
    (doStuffResult) => console.log(`Here's how you make a chain: ${doStuffResult}`), 
    (err) => console.error(`Oh no, doStuff failed!`, err), 
    () => console.debug(`doStuff is done making stuff`) 
) 

Rx.Observable.of(x)は、既存の観察可能な作成機能の例です。それはちょうどxを返すObservableを作成し、完了します。

関連する問題