摘要:可當(dāng)我們進行函數(shù)式編程時,這樣的方式會遇到困難,難點在于如何停止。而在函數(shù)式編程中,數(shù)據(jù)在管道中流動,上一個函數(shù)的返回值會傳給下一個函數(shù),除非報錯,事先寫好的流程是停不下來的。
以下代碼會用到函數(shù)組合函數(shù)compose,只要知道compose是干什么的就足夠了,如果好奇具體的實現(xiàn),可以看《JavaScript函數(shù)式編程之函數(shù)組合函數(shù)compose和pipe的實現(xiàn)》
在寫命令式的代碼時,條件判斷是經(jīng)常使用的,經(jīng)常會有如下類型的需求
if (isTrue) { doSomething(); } else { return; }
比如表單驗證
if (!validate1()) return; if (!validate2()) return; axios.post(...)
如果有一個驗證沒有通過,則停止運行,只有全部都通過才會發(fā)出請求,提交表單。
可當(dāng)我們進行函數(shù)式編程時,這樣的方式會遇到困難,難點在于如何停止。用上面命令式的代碼,return了什么,return到了哪里,我們都不太需要關(guān)心。而在函數(shù)式編程中,數(shù)據(jù)在管道中流動,上一個函數(shù)的返回值會傳給下一個函數(shù),除非報錯,事先寫好的流程是停不下來的。這時,函數(shù)返回了什么,我們是一定要關(guān)心的。
同樣的需求,用函數(shù)式的寫法
let postData = () => axios.post(...); let result = compose(postData, validate2, validate1);
我們同樣希望有一個驗證沒有通過就立刻停止運行,可這是無法實現(xiàn)的,即使你在validate1里面寫了一個return;,這也只不過是停止了validate1的運行,而且還返回了一個undefined傳給了validate2。
那我們應(yīng)該怎么做?
其實可以換一個思路它要返回,就讓它返回,只要返回值在我們的控制中,不用打斷運行同樣也可以達到目的。
let security = fn => val => val === null || val === undefined ? null : fn(val);
我們就可以用一個這樣的函數(shù)來做安全驗證,如果出現(xiàn)了驗證失敗,發(fā)現(xiàn)有空值,就返回一個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)就非常相似。
在寫路由的時候,會有一個路由寫在所有路由的最后,專門用來處理錯誤,借用這個思路,我們同樣也可以在函數(shù)組合時根據(jù)自己的需要在方程的最后做一些保底的操作,例如
let handleError = x => { if (!x) alert("errorMsg"); }; let result = compose(handleError, security(postData), security(validate2), security(validate1));
參考資料:
JS函數(shù)式編程指南
我在github
https://github.com/zhuanyongx...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/94175.html
摘要:在函數(shù)式編程中的錯誤處理,強壯代碼文章中所用的思路與本篇一樣,只不過在函數(shù)式編程中的錯誤處理,強壯代碼中可以認為是以和作為標識,而本篇單獨創(chuàng)造了標識。使用本篇的方法重寫函數(shù)式編程中的錯誤處理,強壯代碼中的代碼參考資料函數(shù)式編程指南我在 以下代碼會用到函數(shù)組合函數(shù)compose,只要知道compose是干什么的就足夠了,如果好奇具體的實現(xiàn),可以看《JavaScript函數(shù)式編程之函數(shù)組合...
摘要:意味著代指的操作由于某些原因失敗。第一步構(gòu)造函數(shù)有三種狀態(tài),。這個構(gòu)造函數(shù)我們可以先這樣寫創(chuàng)建一個時,首先進行狀態(tài)初始化。所有的都是的,而并不是所有的對象都是。 一、JavaScript異步編程背景 ? 從去年ES2015發(fā)布至今,已經(jīng)過去了一年多,ES2015發(fā)布的新的語言特性中最為流行的也就莫過于Promise了,Promise使得如今JavaScript異步編程如此輕松愜意...
摘要:避免脆弱的基類問題。紅牌警告沒有提到上述任何問題。單向數(shù)據(jù)流意味著模型是單一的事實來源。單向數(shù)據(jù)流是確定性的,而雙向綁定可能導(dǎo)致更難以遵循和理解的副作用。原文地址 1. 你能說出兩種對 JavaScript 應(yīng)用開發(fā)者而言的編程范式嗎? 希望聽到: 2. 什么是函數(shù)編程? 希望聽到: 3. 類繼承和原型繼承的不同? 希望聽到 4. 函數(shù)式編程和面向?qū)ο缶幊痰膬?yōu)缺點? ...
摘要:函數(shù)式編程最后介紹一下函數(shù)式編程。函數(shù)式編程是一種歷史悠久,而又在最近頗為熱門的話題。函數(shù)式編程在面向?qū)ο笠辉~誕生以前就已經(jīng)存在,不過它在很長一段時間里都被隱藏于過程式編程面向?qū)ο笠彩沁^程式編程的一種的概念之下。 2.1 JavaScript特點 總結(jié)以下幾個特點: 解釋型語言 類似與C和Java的語法結(jié)構(gòu) 動態(tài)語言 基于原型的面向?qū)ο?字面量的表現(xiàn)能力 函數(shù)式編程 解釋型語言:...
摘要:內(nèi)存泄露內(nèi)存泄露概念在計算機科學(xué)中,內(nèi)存泄漏指由于疏忽或錯誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。判斷內(nèi)存泄漏,以字段為準。 本文是 重溫基礎(chǔ) 系列文章的第二十二篇。 今日感受:優(yōu)化學(xué)習(xí)方法。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎(chǔ)】1-14篇 【重溫基礎(chǔ)】15.JS對象介紹 【重溫基礎(chǔ)】16.JSON對象介紹 【重溫基礎(chǔ)】1...
閱讀 3241·2021-11-22 12:07
閱讀 1882·2021-10-12 10:11
閱讀 1046·2019-08-30 15:44
閱讀 2945·2019-08-30 12:45
閱讀 2197·2019-08-29 16:41
閱讀 1641·2019-08-29 16:35
閱讀 2629·2019-08-29 12:57
閱讀 1154·2019-08-26 13:51