gpt4 book ai didi

javascript - 如何序列化/反序列化 JS observable?

转载 作者:行者123 更新时间:2023-12-02 22:37:30 26 4
gpt4 key购买 nike

如果我有一个可观察的流,使用 RxJS或类似的,像这样(marble图表):

----1------2------3--4---|

如何将其序列化为类似 NDJSON 的格式所以我可以将它保存在数据库中吗?保存后,如何将其重新构建为可观察对象?

对于上下文,我想捕获 DOM 中的用户操作流(例如鼠标拖动等),然后稍后重播它们,与用户最初执行的操作完全相同。

最佳答案

如果时间很重要,您可能希望将时间值与事件本身一起存储。

小POC:

import { fromEvent, Observable, of, timer } from "rxjs";
import {
map,
tap,
mergeMap,
concatMap,
takeUntil,
mapTo
} from "rxjs/operators";

let latestCache: Array<{ time: number; event: MouseEvent }>;

fromEvent(document.getElementById("start-cache"), "click")
.pipe(
concatMap(() => {

const source = fromEvent(window, "mousemove").pipe(
tap((x: MouseEvent) => console.log(x.clientX, x.clientY)),
takeUntil(timer(1000)),
store( newCache => (latestCache = newCache))
);

function store(
onCacheCreated: (
cache: Array<{ time: number; event: MouseEvent }>
) => void
) {
const cache = [];
let lastTime = Date.now();
return tap({
next: (x: MouseEvent) => {
cache.push({ time: Date.now() - lastTime, event: x });
lastTime = Date.now();
},
complete: () => onCacheCreated(cache)
});
}

return source;
})
)
.subscribe();

fromEvent(document.getElementById("replay-cache"), "click")
.pipe(
concatMap(() => {
if (!latestCache) {
console.error("no cache yet");
}
return of(...latestCache).pipe(
concatMap(x => timer(x.time).pipe(mapTo(x.event))),
tap((x: MouseEvent) => console.log(x.clientX, x.clientY))
);
})
)
.subscribe();
<h1>RxJS playground</h1>

<p>Open the console below to see results</p>

<button id="start-cache">Start Cache </button>
<button id="replay-cache">Replay Cache </button>

https://stackblitz.com/edit/rxjs-vxwurq?file=index.ts

从这里开始,您可以使用 onCacheCreated 函数来存储您想要的数组。

关于javascript - 如何序列化/反序列化 JS observable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58697921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com