官术网_书友最值得收藏!

Laziness

Many functional programming languages feature lazy-evaluated APIs. The idea behind lazy evaluation is that operations are not computed until doing so can no longer be postponed. The following example declares a function that allows us to find an element in an array. When the function is invoked, we don't filter the array. Instead, we declare a proxy and a handler:

function lazyFind<T>(arr: T[], filter: (i: T) => boolean): T {

let hero: T | null = null;

const proxy = new Proxy(
{},
{
get: (obj, prop) => {
console.log("Filtering...");
if (!hero) {
hero = arr.find(filter) || null;
}
return hero ? (hero as any)[prop] : null;
}
}
);

return proxy as any;
}

It is only later, when one of the properties in the result is accessed, that the proxy handler is invoked and filtering takes place:

const heroes = [
{
name: "Spiderman",
powers: [
"wall-crawling",
"enhanced strength",
"enhanced speed",
"spider-Sense"
]
},
{
name: "Superman",
powers: [
"flight",
"superhuman strength",
"x-ray vision",
"super-speed"
]
}
];

console.log("A");
const spiderman = lazyFind(heroes, (h) => h.name === "Spiderman");
console.log("B");
console.log(spiderman.name);
console.log("C");

/*
A
B
Filtering...
Spiderman
C
*/

If we examine the console output, we will be able to see that the Filtering... message is not logged into the console until we access the property name of the result object. The preceding implementation is a very rudimentary implementation, but it can help us to understand how lazy evaluation works. Laziness can sometimes improve the overall performance of our applications.

We will learn more about function composition patterns later in Chapter 9, Functional-Reactive Programming.

主站蜘蛛池模板: 宾川县| 连江县| 黄石市| 永仁县| 吉安市| 乌苏市| 西乡县| 竹山县| 澳门| 苍梧县| 濮阳县| 广昌县| 体育| 东兴市| 敖汉旗| 南澳县| 台南县| 洛阳市| 镇平县| 泾川县| 镇江市| 大英县| 曲阳县| 新宁县| 定边县| 固阳县| 襄汾县| 错那县| 涿州市| 安庆市| 柳州市| 韶关市| 美姑县| 镇雄县| 封开县| 鄄城县| 临武县| 江山市| 韶山市| 宜宾市| 获嘉县|