摘要:可當我們進行函數式編程時,這樣的方式會遇到困難,難點在于如何停止。而在函數式編程中,數據在管道中流動,上一個函數的返回值會傳給下一個函數,除非報錯,事先寫好的流程是停不下來的。
以下代碼會用到函數組合函數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));
參考資料:
JS函數式編程指南
我在github
https://github.com/zhuanyongx...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/94175.html
摘要:在函數式編程中的錯誤處理,強壯代碼文章中所用的思路與本篇一樣,只不過在函數式編程中的錯誤處理,強壯代碼中可以認為是以和作為標識,而本篇單獨創造了標識。使用本篇的方法重寫函數式編程中的錯誤處理,強壯代碼中的代碼參考資料函數式編程指南我在 以下代碼會用到函數組合函數compose,只要知道compose是干什么的就足夠了,如果好奇具體的實現,可以看《JavaScript函數式編程之函數組合...
摘要:意味著代指的操作由于某些原因失敗。第一步構造函數有三種狀態,。這個構造函數我們可以先這樣寫創建一個時,首先進行狀態初始化。所有的都是的,而并不是所有的對象都是。 一、JavaScript異步編程背景 ? 從去年ES2015發布至今,已經過去了一年多,ES2015發布的新的語言特性中最為流行的也就莫過于Promise了,Promise使得如今JavaScript異步編程如此輕松愜意...
摘要:避免脆弱的基類問題。紅牌警告沒有提到上述任何問題。單向數據流意味著模型是單一的事實來源。單向數據流是確定性的,而雙向綁定可能導致更難以遵循和理解的副作用。原文地址 1. 你能說出兩種對 JavaScript 應用開發者而言的編程范式嗎? 希望聽到: 2. 什么是函數編程? 希望聽到: 3. 類繼承和原型繼承的不同? 希望聽到 4. 函數式編程和面向對象編程的優缺點? ...
摘要:函數式編程最后介紹一下函數式編程。函數式編程是一種歷史悠久,而又在最近頗為熱門的話題。函數式編程在面向對象一詞誕生以前就已經存在,不過它在很長一段時間里都被隱藏于過程式編程面向對象也是過程式編程的一種的概念之下。 2.1 JavaScript特點 總結以下幾個特點: 解釋型語言 類似與C和Java的語法結構 動態語言 基于原型的面向對象 字面量的表現能力 函數式編程 解釋型語言:...
摘要:內存泄露內存泄露概念在計算機科學中,內存泄漏指由于疏忽或錯誤造成程序未能釋放已經不再使用的內存。判斷內存泄漏,以字段為準。 本文是 重溫基礎 系列文章的第二十二篇。 今日感受:優化學習方法。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1-14篇 【重溫基礎】15.JS對象介紹 【重溫基礎】16.JSON對象介紹 【重溫基礎】1...
閱讀 3247·2021-11-22 12:07
閱讀 1889·2021-10-12 10:11
閱讀 1054·2019-08-30 15:44
閱讀 2951·2019-08-30 12:45
閱讀 2222·2019-08-29 16:41
閱讀 1646·2019-08-29 16:35
閱讀 2639·2019-08-29 12:57
閱讀 1158·2019-08-26 13:51