如何限制服务器事件?

时间:2018-06-27 00:55:14

标签: angular typescript asynchronous rxjs

我有一个angular 6应用程序,它通过websocket(更确切地说是sockjs)与服务器进行通信。 我通过服务器启动一个任务,进行REST调用,并且在websocket上收到了大量消息。 我的代码的工作方式非常糟糕。只要有websocket消息传入,它就基本上锁定屏幕。

我当前的代码是组件

this.scenarioRunnerService.liveUpdate$
.subscribe(response => {
    this.processLiveUpdates(response.payload);
})

服务代码为

StompClientKeeper.getInstance().get()
.subscribe('/topic/abcd',
    (response: Response) => broadcast the new message);

如何更改此设置以不冻结客户端?

1 个答案:

答案 0 :(得分:3)

如果您只想忽略某些消息,因为它们到达得太快,您可能正在寻找auditTime运算符:

file_list = ['tab_team', 'tab_players', 'tab_country']
file_path = ['data', 'docs']

for team in file_list:
    for path in file_path:
        df = sqlContext.read.load("/user/{}/{}/*.csv".format(path, team), format='com.databricks.spark.csv', header='true', inferSchema='true')

        df.registerTempTable("my_temp_table")

        sqlContext.sql("create table {}.`{}_{}` stored as ORC as select * from my_temp_table".format(db_name, path, team))

如果在指定的持续时间内收到多条消息,import { auditTime } from "rxjs/operators"; this.scenarioRunnerService.liveUpdate$.pipe( auditTime(400) ).subscribe(response => { this.processLiveUpdates(response.payload); }); 操作员将忽略除最后收到的消息以外的所有消息。

或者,您可以使用throttleTime运算符。它的行为有所不同,它将传递第一个收到的消息,并限制在指定持续时间内收到的后续消息。

还有sampleTime运算符。再次有所不同,因为它将在指定时间段对接收到的邮件进行采样。

您选择哪种运算符取决于您想要的行为。