我在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。
答案 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
})