6.30学习-函数柯里化,回调解决异步多线程

news/2024/4/28 2:38:28/文章来源:https://blog.csdn.net/qq_45030898/article/details/131510712

6.30学习-函数柯里化,回调解决异步多线程

  • 1.函数柯里化
    • 1.1 确定参数的函数柯里化
    • 1.2参数不确定的函数柯里化
    • 1.3 用法
      • 1.3.1 给setTimeout传递进来的函数添加参数
  • 2.回调解决异步多线程

1.函数柯里化

函数柯里化,经常可能就面试的时候听说过,反正一般开发我就很少用到过(自己层次不够吧)。老规矩,先上一段代码

// function isType(value,type) {
//    return Object.prototype.toString.call(value) === `[object ${type}]`;
// }
// console.log(isType([1,2,3],'Array'))
//但是如果第二个参数传成'array','Arary'等,就会判断不是 function isType(type) {return function (value) {return Object.prototype.toString.call(value) === `[object ${type}]`;}
}
let isArray = isType('Array');
console.log(isArray([1,2,3]))
console.log(isArray(1,2,3))
console.log(isType('Array')([1,2,3]))

上面代码也就是判断变量的类型,但是第一种和第二种的写法不大相同的,第一种写法是一个多个参数的函数,第二个却是变成了单一的参数。其实这就是柯里化。

柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数

上面我们虽然对函数进行了柯里化,但是我们不可能在需要柯里化的时候,都像上面不断地进行函数的嵌套;所以我们通过一个柯里化函数,实现通用的柯里化方法

1.1 确定参数的函数柯里化

const currying = (fn, arr = []) => {let len = fn.length;// return function (...args) {//    arr = [...arr,...args]//    console.log('arr',arr)//    if(arr.length < len){//       return currying(fn, arr)//    }//    else{//       return  fn(...arr)//    }// }return function (...args) {let concatVal = [...arr, ...args]//  console.log('arr',concatVal)if (concatVal.length < len) {return currying(fn, concatVal)}else {return fn(...concatVal)}}
}
function isType(type, value) {return Object.prototype.toString.call(value) === `[object ${type}]`;
}
let isArray = currying(isType)('Array');
let isString = currying(isType)('String');
console.log(isArray)
console.log(isArray([1, 2, 3]))  //true
console.log(isArray('aaa'))  //false
console.log(isString([1, 2, 3]))  //false
console.log(isString('aaa'))  //true

1.2参数不确定的函数柯里化

这里就有个经典的面试题了,实现sum(1,2,3,5)的效果和sum(1,2)(3)(5),sum(1,2,3)(5)一样

function sum() {let args = [...arguments];let res = function () {args.push(...arguments);// let result = args.reduce((pre, cur) => pre + cur)return res}res.toString = function(){return args.reduce((prev,cur)=>prev+cur)  }return res
}
console.log(sum(1, 2, 3).toString(), sum(1).toString()) //6 1console.log(sum(1)(2,5)().toString()) // 8

1.3 用法

用法参考了点击这里跳转

1.3.1 给setTimeout传递进来的函数添加参数

function hello(name) {console.log('Hello, ' + name);
}
setTimeout(hello('kangkang'), 3600); //立即执行,不会在3.6s后执行
setTimeout(function() {hello('kangkang');
}, 3600); // 3.6s 后执行

当然,在ES5里面,我们也可以使用函数的bind方法,如下所示:

setTimeout(hello.bind(this, 'kangkang'), 3600); // 3.6s 之后执行函数

这样也是非常的方便快捷,并且可以绑定函数执行的上下文.

这里我们讨论函数的柯里化,当然我们这里也可以使用函数的柯里化来达到这个效果:

setTimeout(currying (hello, 'kangkang'), 3600); // 其中currying 是上面已经提及过的

2.回调解决异步多线程

let fs = require('fs');
let person = {}
fs.readFile('./1.txt', 'utf8', function(err,data){console.log(data);person.name = data
})
fs.readFile('./2.txt', 'utf8', function(err,data){console.log(data);person.age = data
})
console.log('person',person)

上面这段代码的结果是这样的:
在这里插入图片描述
挺明显的,我们想要拿到的是person {name:‘qiu’,age:‘18’},但是结果却还是个空对象。js中node的readFile方法是异步的,我们的代码也是基于node来运行的。异步是在同步代码后执行的,所以这里打印的的person还是空对象。肯定promise也是可以解决这个问题的,但这里重点讲回调。

let fs = require('fs');
let person = {}
//通过回调
let index = 0
let cb = () => {index++;if(index == 2){console.log('person',person) //person { name: 'qiu', age: '18' }}// console.log(index)
}
fs.readFile('./1.txt', 'utf8', function(err,data){person.name = datacb()
})
fs.readFile('./2.txt', 'utf8', function(err,data){person.age = datacb()
})

可以在读取文件成功后调用函数,再设置个index进行判断结束条件就可以拿到异步结束后的值了。
使用闭包,还可以让代码灵活一点

let fs = require('fs');
let person = {}
function after(index, callback) {// index--;   //闭包函数,函数的定义的作用域和函数执行的作用域 不在同一个作用域下//闭包是定义在一个函数内部的函数,内层函数可以访问外层函数的局部变量,这些变量被内层函数引用不会被回收,//好处是使局部变量拥有更长的生命周期可以用来封装一段逻辑,坏处是闭包常驻内存造成内存泄露。return function () {index--;if (index == 0) {callback();}}
}
let cb = after(2, function () {console.log(person)
})
fs.readFile('./1.txt', 'utf8', function (err, data) {person.name = datacb()
})
fs.readFile('./2.txt', 'utf8', function (err, data) {person.age = datacb()
})

记录一下,持续修改更进

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_325665.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在半导体行业运用IPD?

半导体产业链具体包括上游半导体原材料与设备供应、中游半导体产品制造和下游应用。其中&#xff0c;半导体材料处于上游供应环节&#xff0c;材料品类繁多&#xff0c;按制造流程可细分为前端制造材料和后端封装材料。半导体设备&#xff0c;即在芯片制造和封测流程中应用到的…

智谱AI-算法实习生(知识图谱方向)实习面试记录

岗位描述 没错和我的经历可以说是match得不能再match了&#xff0c;但是还是挂了hh。 面试内容 给我面试的是唐杰老师的博士生&#xff0c;方向是社交网络数据挖掘&#xff0c;知识图谱。不cue名了&#xff0c;态度很友好的 &#xff0c;很赞。 date&#xff1a;6.28 Q1 自…

服务器解析漏洞与cms靶场搭建教程

文章目录 一、解析漏洞定义1.CVE-2017-157152.AddHandler3.IIS64.IIS75.nginx 二、Kali安装docker并搭建DVWA靶场1.安装docker2.启动docker3.安装docker的DVWA容器4.启动dvwa 三、kali搭建vulhub与CVE-2017-15715复现1.安装vulhub2.安装CVE-2017-15715漏洞利用靶场3.启动靶场4.…

液晶铝薄膜的干蚀特性

引言 对于先进的薄膜晶体管液晶显示器(TFT-LCD)制造工艺来说&#xff0c;薄膜层已逐渐取代传统的湿法蚀刻工艺。对于栅电极&#xff0c;一般使用铝(Al)&#xff0c;在Al中加入一些金属&#xff0c;除了可以保持低电阻率和增强Al薄膜的耐腐蚀性外&#xff0c;还可以防止在后退火…

spfa求负环

1.虫洞 Wormholes&#xff08;裸spfa判断负环问题&#xff09; 信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 (ssoier.cn)http://ybt.ssoier.cn:8088/problem_show.php?pid1507 #include<bits/stdc.h> using namespace std; const int N510,M5210; int d…

判断数组中所有元素是否均为实数对象 numpy.isrealobj()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 判断数组中所有元素 是否均为实数对象 numpy.isrealobj() [太阳]选择题 请问关于以下代码的说法错误的是&#xff1f; import numpy as np a np.array([1, 2, 3]) b np.array([1, 1 2j, …

docker学习(七)docker daemon

1.Docker 的CS模式 1.1.Docker 的C/S模式介绍 在 Docker Client 中来运行 Docker 的各种命令&#xff0c;这些命令会传送给在 Docker 的宿主机上运行的 Docker 守护进程。而 Docker 守护进程是负责实现 Docker 各种功能的。 如图所示&#xff0c;Docker 守护进程运行在宿主机…

第四章 数组

前言 学习方法 可以多看几遍视频把上课的代码&#xff0c;自己加加注释&#xff0c;在自己写之前&#xff0c;可以画一个流程图照着流程图把代码自己实现一遍 不要怀疑自己&#xff0c;不要遇到困难就觉得自己不行&#xff0c;遇到困难就解决困难&#xff0c;编程初学者都是…

SSH连接vmware 虚拟机 centos

检查虚拟机设置的网络连接是否为NAT模式 点击左上角“编辑” -> “虚拟网络编辑器” 在虚拟网络编辑器中查看IP地址 &#xff0c;点击NAT模式后&#xff0c;点击“NAT设置 记住自己的网关,下面在服务器中配置需要 进入服务器的 /etc/sysconfig/network-scripts/ 编辑 i…

浑元太极马老师和小薇-UMLChina建模知识竞赛第4赛季第7轮[更新]

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 第7轮一直无人得分&#xff0c;再次更换题目。 因有的题目之前已经出过&#xff0c;本轮需要最先答对全…

Android View 事件派发流程

原文链接 Android View 事件派发流程 自从乔帮主横空出世推出了iPhone以来&#xff0c;触控式的操作便成了21世纪智能设备的标准输入方式。对于同是智能操作系统的Android来说&#xff0c;也不例外。事件&#xff0c;特别是触控事件对于移动应用程序开发来说是一个非常重要的&…

软件DevOps云化发展的趋势 【课程限时免费】

你了解什么是DevOps吗&#xff1f; 它是怎么诞生的&#xff1f; DevOps能做些什么&#xff1f; 相信对于DevOps的实践者和关注者来说&#xff0c;对它已经不陌生了&#xff0c;但是对于刚刚进入开发者领域不久的小伙伴应该并不清楚&#xff0c;下面就让小智带你一起了解DevO…

C. Insert Zero and Invert Prefix - 构造+思维

分析&#xff1a; 数组b的最后一个元素永远不可能使1&#xff0c;因为即使在最后一个位置操作&#xff0c;也只会把前n-1个元素反转&#xff0c;最后一个元素只能为0.然后可以发现只要a[i]0就可以直接输出0&#xff0c;当a[i]1时一连串的1只需要最后一个1的位置改变成1的字串长…

Keil5中写的软件延时函数不起作用现象解析_ARM_Compiler_volatile关键字

一、问题描述 在学习野火霸天虎F407寄存器点亮LED时&#xff0c;出现实验现象&#xff1a;LED灯不亮&#xff0c;野火霸天虎F407资料。 main.c代码如下&#xff1a; #include "stm32f4xx.h"void Delay(unsigned int count);int main(void) { #if 0/* 第一步&a…

oracle rowscn 简单记录

可以通过ROWSCN 侦测row是否有变化&#xff0c;但需要注意&#xff1a; 默认是一个block的scn 相同可以通过create table ROWDEPENDENCIES 在每行上记录无论哪种模式&#xff0c;ROW SCN是一个大致值&#xff0c;不是准确值 NOROWDEPENDENCIES | ROWDEPENDENCIES This claus…

Maven安装和配置详细教程

Maven安装和配置详细教程 1、Maven简介 Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、测试、打包和发布等工作。 2、Maven下载 点击Maven下载官方地址下载Maven。或者去…

C#与C++编程环境对比:优点与应用场景详解

C#与C是两种常用的编程语言&#xff0c;它们在编程环境方面有一些相同点和不同点。首先&#xff0c;它们都可以用于开发跨平台的应用程序。其次&#xff0c;它们都具有强大的面向对象编程能力。但是&#xff0c;它们在语法、性能和应用领域等方面存在一些不同点 。 在语法方面…

使用Wireshark 找出 TCP 吞吐瓶颈

Debug 网络质量的时候&#xff0c;我们一般会关注两个因素&#xff1a;延迟和吞吐量&#xff08;带宽&#xff09;。延迟比较好验证&#xff0c;Ping 一下或者 mtr[1] 一下就能看出来。这篇文章分享一个 debug 吞吐量的办法。 看重吞吐量的场景一般是所谓的长肥管道(Long Fat …

【C】数据在内存中的存储

前言 > 在内存中&#xff0c;整型和浮点型存储的方式是不同的&#xff0c;从内存中读取的方式也是有所差异的&#xff0c;这篇文章主要介绍整型和浮点型在内存中存储的方式。 整型在内存中的存储 计算机中有符号数有3种表示方式&#xff1a; 原码&#xff1a;直接将二进制按…

GO语言包相关总结 -引用(本地和远程),自定义,安装,使用

本篇文章总结以下go语言包相关的知识。 目录 一.导入包 &#xff08;1&#xff09;常规导入 &#xff08;2&#xff09;别名导入 &#xff08;3&#xff09;特殊导入 二.自定义包 三.安装自定义包 四.调用自定义包调用 五.获取远程包 六.go中的保留函数 七.实战 - G…