首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RxJS中实现for-await-of语句

在RxJS中实现for-await-of语句
EN

Stack Overflow用户
提问于 2020-02-22 18:32:32
回答 1查看 701关注 0票数 2

我有以下声明:

代码语言:javascript
复制
for await (const blob of client.list()) {
    console.log('\t', blob.name);
}

client.list()返回一个异步可迭代迭代器,并期望使用

对于await...of

来解决这些承诺。我想将代码合并到一个现有的实例化客户端的rxjs管道中。

我到处看了看,如果不解决管道内部的承诺,而不是转换为可观察的,我不知道如何做到这一点。

任何帮助都将不胜感激!

EN

Stack Overflow用户

回答已采纳

发布于 2020-02-23 07:35:56

我找不到现有的rxjs运算符,但似乎不难创建自己的运算符。在将其他API与可观察对象集成时,您可以在传递给可观察对象构造函数的函数中与API进行交互。这在触发next/error/complete时提供了很大的灵活性。

编辑

+我为此添加了第二个选项,使用rxjs运算符并避免显式调用next/error/complete。

代码语言:javascript
复制
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')
});

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60351247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档