3

我一直在使用我的函数返回 observables 的约定,以实现强制顺序的一系列函数调用,每个函数调用都将返回值传递给它们的后续“回调”函数。但是在阅读和观看教程之后,似乎我可以用我认为的平面图做得更好。我想我很接近这个建议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 上应用运算符来创建 Observables,然后返回它。

就您的示例代码的具体批评而言,您应该使用它.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 创建函数的示例。它只是创建一个返回的 Observable x,然后完成。

于 2016-09-24T07:53:56.407 回答