关于rxjs使用的问题

发布于 2022-09-12 13:52:32 字数 476 浏览 17 评论 0

rxjs虽然对着文档学着使用了一下,但感觉还是很难融会贯通。
我设计了这样一个简单的场景,一个异步的函数get,希望他同步得按顺序依次打印一个数组,并记录这个函数调用的次数。
不使用rxjs我是这样实现的:

const arr = [1, 2, 3, 4, 5]
let count = 0;

f(0)

function get(callback) {
    setTimeout(callback, 1000)
}

function f(idx) {
    if (arr.length === idx) {
        console.log(`共执行${count}次`)
        return
    }
    get(() => {
        console.log(arr[idx])
        ++count
        f(++idx)
    })
}

请问各位,在rxjs下,怎样优雅得实现这个功能?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

若相惜即相离 2022-09-19 13:52:32
const limit = 5
timer(0,1000).pipe(
    take(limit),
    map(n => n + 1)
).subscribe((n) => {
    console.log(n)
    n === limit && console.log(`共执行${limit}次`)
})
原谅过去的我 2022-09-19 13:52:32

思路如下:

  1. 把数组转化为 Observable1 (此时 Observable1 会同步的输出数组里面的元素)
  2. 利用异步的回调函数把 Observable1 进行一个转换 Observable2 (此时 Observable2 会异步输出数组的元素)
  3. 因为需要按顺序依次打印一个数组,所以这里使用 concatMap 对 Observable1 进行一个转换。

代码如下:

import { from, concatMap, Observable } from 'rxjs';

const arr = [1, 2, 3, 4, 5];

function get(callback) {
  setTimeout(callback, 1000);
}

function createObservable(value) {
  return new Observable((subscriber) => {
    get(() => {
      subscriber.next(value);
      subscriber.complete();
    });
  });
}

from(arr)
  .pipe(concatMap((value) => createObservable(value)))
  .subscribe((value) => {
    console.log(value);
  });

在线运行: https://stackblitz.com/edit/r...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文