当前位置: 首页 > 知识库问答 >
问题:

多次通知时behaviorSubject的下一次调用延迟- Angular,Rxjs

白飞飙
2023-03-14

在我的角度应用程序中,我将状态作为 BehaviorSubject 存储在服务中,当数据来自服务器时,我调用下一个函数来更新数据并通知所有订阅者。

伪代码:

   ajaxCall_1 -> updateData(response2)
   ajaxCall_2 -> updateData(response2)
   ajaxCall_3 -> updateData(response3)
   ...
    
private data$:Observable<any>;
public updateData(newData){
var currentData = data$.value;
data$.next({...currentData , ...newData})
}

由于很多组件都订阅了该 BehaviorSubject,我认为在我的应用程序加载时可能会导致一些性能问题:在加载时,有很多来自服务器的通知,每次下一个函数称为组件时都会渲染。

你认为如果我将呼叫延迟到大约500毫秒后,我会看到性能提高吗?rxjs延迟下次通话的方式会是什么?

共有2个答案

裴焱
2023-03-14

这里有一种方法可以决定updateData函数的调用频率(比如每秒一次)。

我在这里所做的是将所有调用缓冲一秒钟,然后将缓冲区缩减为一个对象,然后将该对象发送给updateData。

merge(
  ajaxCall_1,
  ajaxCall_2,
  ajaxCall_3,
  ...
).pipe(
  bufferTime(1000),
  filter(buffer => buffer.length > 0),
  map(bufferedNewData => bufferedNewData.reduce(
    (acc, curr) => ({...acc, ... curr}), {}
  ))
).subscribe(updateData);

另一方面,在第一组调用全部完成之前不显示任何内容可能是有意义的。这可能会使初始负载更可预测。这只是一个微小的变化:

forkJoin([
  ajaxCall_1,
  ajaxCall_2,
  ajaxCall_3,
  ...
]).pipe(
  map(loadNewData => loadNewData.reduce(
    (acc, curr) => ({...acc, ... curr}), {}
  ))
).subscribe(updateData);
艾跃
2023-03-14

性能影响将来自订阅该行为主体的组件,而不是其本身。

无论如何,您可以使用延迟运算符来延迟下一个呼叫,如下所示:

private sub$ = new BehaviorSubject<any>(null);
public data$ = this.sub$.pipe(delay(500)));

public updateData(newData){
  var currentData = sub$.value;
  sub$.next({...currentData , ...newData})
}
 类似资料:
  • 这就是我的表单的样子: 如果用户快速按下提交按钮10次,表单也将提交10次。我尝试将添加到submit按钮和下面的脚本中,但这并不能起到任何作用: 有什么解决方法吗?

  • AngularJS自1.3.0-beta.10版本以来有一个新功能:“惰性一次性绑定”。 简单表达式的前缀可以是<代码>:: ,告诉angular在首次计算表达式后停止监视。给出的常见示例如下: 下面的表达式有类似的语法吗?

  • 延迟调用一个函数,直到当前调用堆栈已经清除。 使用 setTimeout() ,超时时间为1ms,将新事件添加到浏览器事件队列,并允许渲染引擎完成其工作。使用展开 (...) 运算符为函数提供任意数量的参数。 const defer = (fn, ...args) => setTimeout(fn, 1, ...args); // Example A: defer(console.log, 'a

  • Go 语言中没有提供其它面向对象语言的析构函数,但是 Go 语言提供了 defer 语句用于实现其它面向对象语言析构函数的功能 defer 语句常用于 释放资源、解除锁定 以及 错误处理 等 例如C语言中我们申请了一块内存空间,那么不使用时我们就必须释放这块存储空间 例如C语言中我们打开了一个文件,那么我们不使用时就要关闭这个文件 例如C语言中我们打开了一个数据库, 那么我们不使用时就要关闭这个数

  • 问题内容: 因此,我现在正在使用Swift,并且在激活某个开关的某个时间出现了一条通知。 但是,当另一个开关被激活时,我希望在另一个时间发出另一个通知。 这是我的ViewController代码: 这是第一个快速文件,其中包含第一次切换的时间: 我希望下次通知时间是下午1点。这是我为此制作的快速文件: 我对此有疑问,在此先感谢您的帮助! 问题答案: 扩充功能:

  • 我在useEffect钩子中运行setInterval来循环函数,但是,我希望在应用延迟(interval)之前能够先运行该函数一次。在应用延迟之前,是否有一种方法可以在useEffect钩子中运行该函数一次? 在setInterval函数之前,我曾尝试在钩子中运行该函数一次,但它没有给我希望的结果。在useEffect挂钩之外运行函数也是如此。 我希望在setInterval的延迟开始之前运行一