node.js - Angular 4 中的数组推送导致浏览器卡住/卡住。如何解决此问题?

标签 node.js angular browser

我在logsCompoment.ts中有一个名为logs的数组,我将新日志推送到该数组并使用ngFor将日志写入html页面。 我按照以下方式执行此操作。

this.socket.on('newline', (data) => {
                this.logs.push(data);
                }
            });

在logsCompoment.html中,我执行以下操作来显示日志。

<li *ngFor="let log of logs" [innerHTML]="log"></li>

如果日志不经常出现,一切都会正常。但是,如果日志非常频繁地出现(例如每秒大约 1000 行),则会卡住浏览器。 我的问题是,如何处理这种情况。如果我没有遵循正确的方法来实现这一点,请用正确的方法来回答我,这样浏览器就不会卡住。

最佳答案

您可以尝试将 rxjs SubjectbufferTime() 一起使用。这将使 DOM 更新保持一致的频率。

<小时/>

根据OP的要求,这里是工作示例。我使用了 bufferTime() 而不是之前建议的 debounce

这是 slackbitz 中的一个工作示例。 以及实际代码片段:

import { Subject } from 'rxjs';
import { scan, bufferTime } from 'rxjs/operators';
import { interval, Observable } from 'rxjs';

@Component({
  ...
})
export class AppComponent  {
  logs$ = new Subject();
  delayed$: Observable<string[]>;

  constructor () {} 

  ngOnInit() {
    this.delayed$ = this.logs$
    .pipe(
      bufferTime(5000),
      scan((acc: string[], curr: string[]) => [...acc, ...curr], []),
    );

    // stand in code to replace OP's .socket() event listener
    const source = interval(100);
    source.subscribe(num => this.logs$.next(`<p>Log Item ${num}</p>`))
  }
}

然后在你的html中,你只需要订阅即可。例如

<li *ngFor="let log of (delayed$ | async)" [innerHTML]="log"></li>

关于node.js - Angular 4 中的数组推送导致浏览器卡住/卡住。如何解决此问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52765297/

相关文章:

node.js - 如何使用exports.up方法?

node.js - 使用 Nodejs 的 Gmail API 推送通知

javascript - Node.js 作为前端应用程序的后端服务器

angular - CdkVirtualScrollViewport 已附加(错误)

javascript - 在 React 中关闭浏览器的确认框

python - 使用 Selenium Web 驱动程序为每个选项卡进行一个 session ?

javascript - 如何确定用户在 JavaScript 中运行的 IE 版本?

node.js - Mocha 运行正确,但显示未定义

javascript - 错误错误 : Uncaught (in promise): Error: BrowserModule has already been loaded : angular 6

typescript - Angular 2 RC2 单选按钮绑定(bind)损坏