我试图从承诺中获取一个值,然后使用该值来解决另一个承诺。
没有rxjs
就像这样:
Promise.resolve(1)
.then(value => Promise.resolve(value + 1))
.then(value => console.log(value))
输出:
2
我在rxjs
:
const observable = Rx.Observable.fromPromise(Promise.resolve(1))
.map(value => {
return Rx.Observable.fromPromise(Promise.resolve(value + 1));
})
const observer = value => console.log(value);
observable.subscribe(observer);
输出:
PromiseObservable {
_isScalar: false,
promise: Promise { 2 },
scheduler: undefined }
答案 0 :(得分:3)
observable.map()
应该将观察到的值转换为不同的值。如果你在那里返回一个observable,你将你的值转换为一个observable,所以当然你不会得到一个值。从本质上讲,您将可观察到的值转换为可观察到的值的可观察值。
如果您想要返回一个observable并“解压缩”,则需要使用concatMap
运算符(通常也称为flatMap
):
Rx.Observable.fromPromise(Promise.resolve(1))
.concatMap(value => {
return Rx.Observable.fromPromise(Promise.resolve(value + 1));
})
.subscribe(value => console.log(value));
// logs out 2
答案 1 :(得分:1)
你几乎就在那里。请记住,Promises是Monads,意味着它们实现了flatMap
,它被.then()
伪装。使用RxJS时,你必须自己弄平:
const observable = Rx.Observable.fromPromise(Promise.resolve(1))
.switchMap(value => {
return Rx.Observable.fromPromise(Promise.resolve(value + 1));
})
const observer = value => console.log(value);
observable.subscribe(observer);

<script src="https://unpkg.com/@reactivex/rxjs/dist/global/Rx.js"></script>
&#13;
tl; dr; fromPromise
返回Observable of Observables。这就是你必须压扁结果的原因。