react hooks 底层机制参考了 algebraic effects,但在网上搜索这个词汇,大多都是偏学术的,我不擅长谈论学术,只能根据个人经验对 algebraic effects 做一些相关思考
简单来说, 其实就是 try/catch
的一种变体。 algebraic effects 主要解决2个问题
function logName(name){
if(!name) throw "need name input"
console.log(name)
}
function otherStuff(){
// ...
}
try {
logName()
otherStuff()
} catch(error) {
}
上述代码若入参name
缺失, 会直接停止执行, 导致后续 otherStuff
方法不被执行。algebraic effects就是解决此类问题的方式,
通过增加一个关键词effect
或者perform
, 既能抛出错误,也能同时恢复代码继续执行
参考如下代码(effect
, resume
为假定关键词)
effect
,resume
关键词当前不存在,仅假设!
function logName(name){
if(!name) effect "need name input"
console.log(name)
}
function otherStuff(){
// ...
}
try {
logName()
otherStuff()
} catch(error) {
if(error === 'need name input') {
resume "Tom"
}
}
同时algebraic effects也支持async/await
try {
logName()
otherStuff()
} catch(error) {
if(error === 'need name input') {
resume await fetch("fetch default name url")
}
}
自从工作以来, 似乎就没有接触过AOP,依稀记得在大学期间学习java有过短暂接触。algebraic effects主要通过分割无关内容,让开发者更聚焦同一份工作职责(更加模块化)
当前js可以通过 Generator 实现类AOP能力
algebraic effects比继承,接口,minin, 对代码本身侵入性更少(不改变原型链), 又比装饰器(Dependent Inject)灵活性更高(可以控制代码任意执行顺序)。 特别适合在大型系统层级分明的架构之中。 另外react hooks 也是基于理论实现的。 但是根据个人经验,在前端领域里面几乎不存在大型系统。
async/await
更早出现,但依然输给了async/await
, 前端更适合简单易懂的语法try/catch
的缺点对实际开发并无太多影响