当前位置: 首页 > Web前端 > HTML5

【前端说说_3】从filter说到Promise

时间:2023-04-05 13:04:51 HTML5

前言在学习前端的时候,总能听到很多高级词汇,比如函数式编程(FunctionalProgramming)&高阶函数(Higher-order函数),我今天要讲的。-订单功能)。但是当你真正了解什么是函数式编程&高阶函数时,你可能会发现你几乎每天都在用它,却不知道它是高阶函数/函数式编程。JavaScript中的函数在javascript中,一个函数就是一个值,例如:constdouble=function(x){returnx*2}我们把一个函数作为一个值赋给变量double,这在我们的代码中很常见吧?你是否经常听到或看到这样一句话:“函数是JavaScript中的一等公民”乍一看很难理解,但它的意思很简单:函数与字符串/数字没有区别,它可以声明为变量或作为参数传递给其他函数。什么是高阶函数?什么是高阶函数?其实我们在上一段已经说过,我们可以将函数A作为参数传递给另一个函数B,那么接收该函数作为参数的函数B就是一个高阶函数。这只是为了让大家理解。高阶函数的定义就是:“一个函数的参数是另一个函数,或者一个函数的返回值是另一个函数”高阶函数filter的例子说到filter(),肯定是熟悉它。它接收一个回调函数作为它的参数,所以它是一个典型的高阶函数。比如:我们有这样一个数组,我们需要过滤掉类别html&css对应的书籍。constbooks=[{name:'gitbook',category:'git'},{name:'reactbook',category:'react'},{name:'vuebook',category:'vue'},{name:'cssbook',category:'html&css'},{name:'htmlbook',category:'html&css'},]传统的写法是这样的:lethtml_css_books=[]for(leti=0;iitem.category==='html&css')我知道这是一个大家都懂的例子,从这里可以看出几个高阶函数的好处?更短的代码,更少的错误,更多的重用。你可能不同意第三点,因为你可能会说,我们没有重用任何代码?但是如果我们提取传入过滤器的回调函数呢?因为真正决定要过滤哪些数据的是这部分。constis_html_css_books=item=>item.category==='html&css'constis_git_books=item=>item.category==='git'constis_not_git_books=item=>item.category!=='git'consthtml_css_books=书籍。filter(is_html_css_books)constgit_books=books.filter(is_git_books)constnot_git_books=books.filter(is_not_git_books)清晰简洁,不是吗?filter&map&find&reduce这些都是我们常见的高阶函数,但是它们的用法不一样函数返回值filterlargearray=>smallarraymaparray=>arrayfindarray=>singleelementreducearray=>Large数组/小数组/单元素/等长数组/字符串/数字/其他值化简的方式有很多种,甚至可以代替我们刚才说的三个高阶函数。我们会在下一篇内容中讲到reduce。接下来我们来看看高阶函数可能遇到的问题,以及如何解决。问题与问题解决让我们一起来看一个场景。比如我们需要计算a和b两个值的和加3的两倍。我们可以定义两个函数functiondouble(a,b){return(a+b)*2}functionadd3(a){returna+3}然后我们会这样调用它:add3(double(1,3))但是如果我们需要再加3次呢?add3(add3(add3(add3(add3(double(1,3))))))是的,虽然计算没有错误,但是我们的可读性大大降低了,那么这种情况怎么处理呢?解决方法:解决嵌套的链优化第一种方法就是拆解嵌套,链式调用,就像链条一样,一圈一圈,最后一个结果作为下一个参数。constchainObj={double(a,b){this.temp=(a+b)*2;归还这个;},add3(){this.temp+=3;归还这个;},getValue(){constvalue=this.temp;//记得在这里初始化临时值this.temp=undefined;返回值;}};所以我们上面的嵌套现在可以这样写:chainObj.double().add3().add3()。add3().add3().getValue()Promise代码chainObj.double().add3().add3().add3().add3().getValue()与Promise代码promise.then(fn).then的对比(fn)...是不是很像?没错,我们平时写的promise其实就是在处理我们高阶函数的执行顺序。那么Promise是如何实现这样的链式调用的呢?下次再跟大家分享~最后来了Dendoink奇物周刊掘金原作者【合编/小册子作者】segmentfault【说说前端/系列作者】公众号【前端小霸王/首席作家】对于技术人:技术是个人的战斗能力,艺术是使用能力的方法。得心应手,出神入化就是艺术。在前端娱乐圈,我想做一个优秀的人民艺术家。扫码关注公众号前端小霸王我在这里等你: