Open Twlig opened 2 years ago
代数效应是函数式编程中的一个概念,用于将副作用从函数调用中分离。
代数效应
函数式编程
副作用
函数
function getPicNum(name) { const picNum = perform name; return picNum; } try { getTotalPicNum('kaSong', 'xiaoMing'); } handle (who) { switch (who) { case 'kaSong': resume with 230; case 'xiaoMing': resume with 122; default: resume with 0; } }
上面是虚构的语法。当执行到getTotalPicNum内部的getPicNum方法时,会执行perform name。
getTotalPicNum
getPicNum
perform name
此时函数调用栈会从getPicNum方法内跳出,被最近一个try...handle捕获。类似throw Error后被最近一个try...catch捕获。
try...handle
throw Error
try...catch
类似throw Error后Error会作为catch的参数,perform name后name会作为handle的参数。
Error
catch
name
handle
与try...catch最大的不同在于:当Error被catch捕获后,之前的调用栈就销毁了。而handle执行resume后会回到之前perform的调用栈。
resume
perform
对于case 'kaSong',执行完resume with 230;后调用栈会回到getPicNum,此时picNum === 230
case 'kaSong'
resume with 230;
picNum === 230
总结: 代数效应能够将副作用(例子中为请求图片数量)从函数逻辑中分离,使函数关注点保持纯粹。只关注从getPicNum拿到了什么,而不关注它的执行过程和产生的异步副作用。
请求图片数量
那么代数效应与React有什么关系呢?最明显的例子就是Hooks。
React
Hooks
对于类似useState、useReducer、useRef这样的Hook,我们不需要关注FunctionComponent的state在Hook中是如何保存的,React会为我们处理。
useState
useReducer
useRef
Hook
FunctionComponent
state
我们只需要假设useState返回的是我们想要的state,并编写业务逻辑就行。
function App() { const [num, updateNum] = useState(0); return ( <button onClick={() => updateNum(num => num + 1)}>{num}</button> ) }
原文链接:https://react.iamkasong.com
代数效应
代数效应
是函数式编程
中的一个概念,用于将副作用
从函数
调用中分离。上面是虚构的语法。当执行到
getTotalPicNum
内部的getPicNum
方法时,会执行perform name
。此时函数调用栈会从
getPicNum
方法内跳出,被最近一个try...handle
捕获。类似throw Error
后被最近一个try...catch
捕获。类似
throw Error
后Error
会作为catch
的参数,perform name
后name
会作为handle
的参数。与
try...catch
最大的不同在于:当Error
被catch
捕获后,之前的调用栈就销毁了。而handle
执行resume
后会回到之前perform
的调用栈。对于
case 'kaSong'
,执行完resume with 230;
后调用栈会回到getPicNum
,此时picNum === 230
总结:
代数效应
能够将副作用
(例子中为请求图片数量
)从函数逻辑中分离,使函数关注点保持纯粹。只关注从getPicNum拿到了什么,而不关注它的执行过程和产生的异步副作用。代数效应在React中的应用
那么
代数效应
与React
有什么关系呢?最明显的例子就是Hooks
。对于类似
useState
、useReducer
、useRef
这样的Hook
,我们不需要关注FunctionComponent
的state
在Hook
中是如何保存的,React
会为我们处理。我们只需要假设
useState
返回的是我们想要的state
,并编写业务逻辑就行。原文链接:https://react.iamkasong.com