2016-09-23 69 views
2

我一直在使用一个约定,其中我的函数返回observables以实现一系列强制顺序函数调用,每个函数都将返回值传递给它们的下一个“回调”函数。但在阅读和观看教程后,我认为我可以用我认为是flatmap的更好的方式做到这一点。我认为我接近这个建议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(); 
    } 
} 

回答

1

在RxJS的一般规则的拇指是,你应该尽量避免创建手工制作,定制的观测量(即使用Observable.create()),除非你知道你在做什么,并且无法避免它。有一些棘手的语义,如果你没有牢牢掌握RxJS的'合同',很容易引起微妙的问题,因此通常尝试使用现有的Observable创建函数会更好。更好的是,通过在现有的Observable上应用运算符来创建Observables,然后返回它。

根据对示例代码的具体批评,您应该使用.flatMap()来创建Observable函数链。你现在拥有的嵌套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,然后完成。