以下代碼會用到函數組合函數compose,只需曉得compose是干什麼的就足夠了,假如獵奇詳細的完成,能夠看《JavaScript函數式編程之函數組合函數compose和pipe的完成》
在寫敕令式的代碼時,前提推斷是常常運用的,常常會有以下範例的需求
if (isTrue) {
doSomething();
} else {
return;
}
比方表單考證
if (!validate1()) return;
if (!validate2()) return;
axios.post(...)
假如有一個考證沒有經由過程,則住手運轉,只要全部都經由過程才會發出要求,提交表單。
可當我們舉行函數式編程時,如許的體式格局會遇到困難,難點在於怎樣住手。用上面敕令式的代碼,return了什麼,return到了那裡,我們都不太須要體貼。而在函數式編程中,數據在管道中活動,上一個函數的返回值會傳給下一個函數,除非報錯,事前寫好的流程是停不下來的。這時刻,函數返回了什麼,我們是一定要體貼的。
一樣的需求,用函數式的寫法
let postData = () => axios.post(...);
let result = compose(postData, validate2, validate1);
我們一樣願望有一個考證沒有經由過程就馬上住手運轉,可這是沒法完成的,縱然你在validate1內里寫了一個return;
,這也只不過是住手了validate1的運轉,而且還返回了一個undefined
傳給了validate2。
那我們應當怎麼做?
實在能夠換一個思緒
它要返回,就讓它返回,只需返回值在我們的掌握中,不必打斷運轉一樣也能夠到達目標。
let security = fn => val => val === null || val === undefined ? null : fn(val);
我們就能夠用一個如許的函數來做平安考證,假如湧現了考證失利,發明有空值,就返回一個null,假如準確就一般運轉。
所以,之前的代碼就能夠如許改寫,把可能會失足的處所全都包起來
let postData = () => axios.post(...);
let result = compose(security(postData), security(validate2), security(validate1));
起首傳給validate1的值,假如是空,則返回空給下一步,下一步一樣有security的平安考證,接到空值往下通報。
看到這裏,是否是覺得這類思緒有點熟習?
我們在用express寫路由的時刻,通常會如許寫
try {
doSomething();
} catch(err) {
next(err);
}
這個security要領與next(err)
就異常類似。
在寫路由的時刻,會有一個路由寫在一切路由的末了,特地用來處置懲罰毛病,借用這個思緒,我們一樣也能夠在函數組應時依據本身的須要在方程的末了做一些保底的操縱,比方
let handleError = x => {
if (!x) alert("errorMsg");
};
let result = compose(handleError, security(postData), security(validate2), security(validate1));
參考資料:
我在github
https://github.com/zhuanyongx…