Rxjava2如何简洁地将结果从链中的上一个节点返回到下一个节点

时间:2018-08-04 16:11:59

标签: node.js firebase promise rx-java2

我在android中使用rxjava2,有时遇到这样的问题:

Observable.fromArray(
         // maybe a list about photo url in SDCard
    )
    .flatMap(
         // make list to single and upload to server,
         // use retrofit observable<uploadResponse>
    )
    .map(uploadResponse -> {
        // *Problem of point
    })
    .map(
        // in this map I want to get this single photo url in SDCard
        // and some info from uploadResponse,how to do in 
        // *Problem of point of previous map?
     );

此代码忽略了一些线程切换和其他不重要的步骤。此问题也使我对nodejs的Promise感到困惑,如何将某些值传递给chain的每一步?我在firebase上使用了nodejs的version6,不支持await。

1 个答案:

答案 0 :(得分:1)

对于JavaScript的一部分问题,可以通过async..await方便地解决:

(async () => {
  const foo = await fooPromise;
  const bar = await getBarPromise(foo);
  const baz = await getBazPromise(bar);
})()
.catch(console.error);
  

我在firebase上使用了nodejs的version6,它不支持await。

async..await后面的模式由于在节点4中出现了生成器而被广泛使用。可以使用co来实现相同的功能,这是最著名的实现方式:

const co = require('co');

co(function * () {
  const foo = yield fooPromise;
  const bar = yield getBarPromise(foo);
  const baz = yield getBazPromise(bar);
})
.catch(console.error);

由于async函数是诺言的语法糖,因此async函数所做的所有事情都可以单独用诺言重写。

鉴于稍后可能需要一个值(foo

fooPromise
.then(foo => getBarPromise(foo))
.then(bar => getBazPromise(bar))
.then(baz => {
  // foo and baz are needed here
});

它应该与其他结果一起通过链传递:

fooPromise
.then(foo => {
  return getBarPromise(foo).then(bar => ({ foo, bar }));
})
.then(({ foo, bar }) => {
  return getBazPromise(bar).then(baz => ({ foo, baz }));
})
.then(({ foo, baz }) => {
  // foo and baz are destructured from the result
});

或者应嵌套promise,以使foo在当前功能范围内可用:

fooPromise
.then(foo => {
  return getBarPromise(foo)
  .then(bar => getBazPromise(bar))
  .then(baz => {
    // foo and baz are available here
  })
});

相同的配方适用于其他API和语言。例如,RxJS:

fooObservable
.flatMap(foo => Observable.zip(
  Observable.of(foo),
  getBarObservable(foo)
))
.map(([foo, bar]) => {
  // foo and bar are destructured from the result
})