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

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.

主站蜘蛛池模板: 大英县| 安新县| 克拉玛依市| 巴塘县| 进贤县| 怀柔区| 宜都市| 西乌珠穆沁旗| 武义县| 阿图什市| 遵义县| 友谊县| 南澳县| 丹寨县| 杭锦后旗| 丰台区| 祁东县| 房山区| 偏关县| 竹山县| 广灵县| 武平县| 湘乡市| 合阳县| 丹江口市| 博野县| 罗田县| 娄底市| 大关县| 贵阳市| 南岸区| 平湖市| 根河市| 汽车| 广河县| 永川市| 霞浦县| 仲巴县| 衡南县| 根河市| 修水县|