我正在开发一个简单的Javascript模块,我希望使其遵循功能性编程风格。
该模块基本上允许您测量事件开始和结束时经过了多少时间,并以2个测量结果的块的形式发送数据:
const register = {
marks: {},
marksCount: 0,
restart: function () {
this.marks = {}
this.marksCount = 0
},
startMark: function (id) {
performance.mark(`${id}/start`)
},
finishMark: function (id) {
performance.mark(`${id}/end`)
performance.measure(id, `${id}/start`, `${id}/end`)
this.marksCount++
this.marks[id] = performance.getEntriesByName(id, 'measure')[0]
if (this.marksCount === 2) {
console.log(this.marks)
this.restart()
}
}
}
// then you can use it like this
register.startMark('event1')
register.startMark('event2')
register.finishMark('event1')
register.finishMark('event2')
我一直在阅读有关FP如何管理状态的文章,我真的很想看看如何使用纯FP原理来编写这个简单的模块,特别是我们如何防止对属性进行突变。
答案 0 :(得分:2)
使对象不可写是非常简单的。例如。
const storage = v => () => v;
const test = storage(10);
console.log(test()); // prints 10, but you have no way to change v
时间度量的功能版本可能如下所示:
const startMark = () => {
const start = performance.now();
return () => {
const end = performance.now();
return end - start;
};
}
// How to use
const endMark1 = startMark();
const endMark2 = startMark();
const result1 = endMark1();
const result2 = endMark2();
console.log('time1', result1, 'time2', result2);
// do something else
const result11 = endMark1();
console.log('time1-2', result11);
由于其功能正常,您可以多次使用endTimer
,它将返回从开始到现在的时间,即使是连续调用也是如此。