我有以下声明:
for await (const blob of client.list()) {
console.log('\t', blob.name);
}client.list()返回一个异步可迭代迭代器,并期望使用
对于await...of
来解决这些承诺。我想将代码合并到一个现有的实例化客户端的rxjs管道中。
我到处看了看,如果不解决管道内部的承诺,而不是转换为可观察的,我不知道如何做到这一点。
任何帮助都将不胜感激!
发布于 2020-02-23 07:35:56
我找不到现有的rxjs运算符,但似乎不难创建自己的运算符。在将其他API与可观察对象集成时,您可以在传递给可观察对象构造函数的函数中与API进行交互。这在触发next/error/complete时提供了很大的灵活性。
编辑
+我为此添加了第二个选项,使用rxjs运算符并避免显式调用next/error/complete。
const {
Observable,
operators,
from
} = rxjs;
const {take, takeWhile, expand, map, filter} = operators;
const asyncGen = async function*(x = -1) {
while(x++ < 5) {
yield x;
}
};
const fromAsyncIter = iterable => new Observable(subscriber => {
let unsubscribed = false;
const iterate = async () => {
try {
for await (let n of iterable) {
console.log('await', n);
subscriber.next(n);
if (unsubscribed) return;
}
subscriber.complete();
} catch (e) {
subscriber.error(e);
}
}
iterate();
return () => unsubscribed = true;
});
const fromAsyncIter2 = iterable =>
from(iterable.next()).pipe(
expand(() => iterable.next()),
takeWhile(x => !x.done),
map(x => x.value)
);
// const source = fromAsyncIter(asyncGen()).pipe(take(2));
const source = fromAsyncIter2(asyncGen()).pipe(take(2));
source.subscribe({
next: x => console.log('next', x),
error: e => console.error(e),
complete: () => console.log('complete')
});
https://stackoverflow.com/questions/60351247
复制相似问题