Rxjs 将回调shell转换为可观察链

Rxjs 将回调shell转换为可观察链,rxjs,angular2-observables,Rxjs,Angular2 Observables,我一直在使用一种约定,在这种约定中,我的函数返回可观察值,以实现一系列强制顺序的函数调用,每个函数调用都将返回值传递给它们下面的“回调”函数。但在阅读和观看教程之后,似乎我可以用我认为是flatmap的东西做得更好。我想我很赞同这个建议,虽然我不是从承诺开始的。下面我列出了一个例子,我希望通过一个更好的方法来帮助清理。我非常感谢您提供的帮助: grandparentFunction().subscribe(grandparentreturnobj => { ... oprate

我一直在使用一种约定,在这种约定中,我的函数返回可观察值,以实现一系列强制顺序的函数调用,每个函数调用都将返回值传递给它们下面的“回调”函数。但在阅读和观看教程之后,似乎我可以用我认为是flatmap的东西做得更好。我想我很赞同这个建议,虽然我不是从承诺开始的。下面我列出了一个例子,我希望通过一个更好的方法来帮助清理。我非常感谢您提供的帮助:

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

RxJS中的一般经验法则是,除非您知道自己在做什么,并且无法避免,否则您应该真正尝试避免创建手工定制的可观察对象(即使用
Observable.create()
)。如果您对RxJS的“契约”没有很好的理解,那么有一些棘手的语义很容易导致微妙的问题,因此通常最好尝试使用现有的可观察创建函数。更好的是,通过对现有的可观察对象应用操作符来创建可观察对象,并返回该对象

对于示例代码的具体评论,您应该使用
.flatMap()
创建可观察的函数链,这是正确的。您当前拥有的嵌套的
Observable.create()
s与Rx不太相似,并且遇到了与“回调地狱”(callback hell)样式的代码相同的问题

下面是一个示例,它与您的示例所做的事情相同,但采用了更为惯用的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 creator函数的一个示例。它只创建一个返回
x
的可观察对象,然后完成