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