如何将承诺联系在一起

时间:2017-01-19 10:41:12

标签: javascript promise rxjs

我试图从承诺中获取一个值,然后使用该值来解决另一个承诺。

没有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 }

2 个答案:

答案 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;
&#13;
&#13;

tl; dr; fromPromise返回Observable of Observables。这就是你必须压扁结果的原因。