3

私は、それぞれが次の「コールバック」関数に戻り値を渡す強制的な連続した一連の関数呼び出しを実現するために、関数がオブザーバブルを返すという規則を使用してきました。しかし、チュートリアルを読んで見た後、フラットマップだと思うものでこれをよりうまく行うことができるようです。私は約束から始めていませんが、私はこのアドバイスhttps://stackoverflow.com/a/34701912/2621091に近いと思います。以下に、より良いアプローチに関するアドバイスでクリーンアップするのに役立つことを望んでいる例をリストします。あなたが提供できる助けにとても感謝しています:

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(); 
    }
}
4

1 に答える 1

2

Observable.create()RxJS の一般的な経験則は、自分が何をしているのかを理解していない限り、手作りのカスタム Observable を作成する (つまり、 を使用する) ことを避けるべきであり、それを避けることができないということです。RxJS の「コントラクト」をしっかりと把握していないと、簡単に微妙な問題を引き起こす可能性のあるトリッキーなセマンティクスがいくつかあるため、通常は既存の Observable 作成関数を使用することをお勧めします。さらに良いことに、既存の Observable に演算子を適用して Observable を作成し、それを返します。

.flatMap()サンプルコードの特定の批評に関しては、 Observable 関数チェーンを作成するために使用する必要があることは正しいです。あなたが現在持っているネストされたObservable.create()s はあまり 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)既存の Observable クリエーター関数の例です。xを返し、完了するObservable を作成するだけです。

于 2016-09-24T07:53:56.407 に答える