资讯专栏INFORMATION COLUMN

JavaScript函数式编程之错误处理,强壮代码

Yi_Zhi_Yu / 3086人阅读

摘要:可当我们进行函数式编程时,这样的方式会遇到困难,难点在于如何停止。而在函数式编程中,数据在管道中流动,上一个函数的返回值会传给下一个函数,除非报错,事先写好的流程是停不下来的。

以下代码会用到函数组合函数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...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94175.html

相关文章

  • JavaScript函数编程管道分支,消除if/else的一种方

    摘要:在函数式编程中的错误处理,强壮代码文章中所用的思路与本篇一样,只不过在函数式编程中的错误处理,强壮代码中可以认为是以和作为标识,而本篇单独创造了标识。使用本篇的方法重写函数式编程中的错误处理,强壮代码中的代码参考资料函数式编程指南我在 以下代码会用到函数组合函数compose,只要知道compose是干什么的就足够了,如果好奇具体的实现,可以看《JavaScript函数式编程之函数组合...

    IntMain 评论0 收藏0
  • Build Your Own Promise

    摘要:意味着代指的操作由于某些原因失败。第一步构造函数有三种状态,。这个构造函数我们可以先这样写创建一个时,首先进行状态初始化。所有的都是的,而并不是所有的对象都是。 一、JavaScript异步编程背景 ​ 从去年ES2015发布至今,已经过去了一年多,ES2015发布的新的语言特性中最为流行的也就莫过于Promise了,Promise使得如今JavaScript异步编程如此轻松惬意...

    susheng 评论0 收藏0
  • 【译】每个JavaScript 开发者应该了解的10个面试题

    摘要:避免脆弱的基类问题。红牌警告没有提到上述任何问题。单向数据流意味着模型是单一的事实来源。单向数据流是确定性的,而双向绑定可能导致更难以遵循和理解的副作用。原文地址 1. 你能说出两种对 JavaScript 应用开发者而言的编程范式吗? 希望听到: 2. 什么是函数编程? 希望听到: 3. 类继承和原型继承的不同? 希望听到 4. 函数式编程和面向对象编程的优缺点? ...

    mykurisu 评论0 收藏0
  • JavaScript编程全解 —— 基础

    摘要:函数式编程最后介绍一下函数式编程。函数式编程是一种历史悠久,而又在最近颇为热门的话题。函数式编程在面向对象一词诞生以前就已经存在,不过它在很长一段时间里都被隐藏于过程式编程面向对象也是过程式编程的一种的概念之下。 2.1 JavaScript特点 总结以下几个特点: 解释型语言 类似与C和Java的语法结构 动态语言 基于原型的面向对象 字面量的表现能力 函数式编程 解释型语言:...

    CoreDump 评论0 收藏0
  • 【重温基础】22.内存管理

    摘要:内存泄露内存泄露概念在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。判断内存泄漏,以字段为准。 本文是 重温基础 系列文章的第二十二篇。 今日感受:优化学习方法。 系列目录: 【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理) 【重温基础】1-14篇 【重温基础】15.JS对象介绍 【重温基础】16.JSON对象介绍 【重温基础】1...

    Pandaaa 评论0 收藏0

发表评论

0条评论

Yi_Zhi_Yu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<