博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
遇到的柯里化函数使用场景记录
阅读量:7047 次
发布时间:2019-06-28

本文共 1981 字,大约阅读时间需要 6 分钟。

节流,防抖

考虑一个场景,滚动事件中会发起网络请求,但是我们并不希望用户在滚动过程中一直发起请求,而是隔一段时间发起一次,对于这种情况我们就可以使用节流。

// func是用户传入需要防抖的函数// wait是等待时间const throttle = (func, wait = 50) => {  // 上一次执行该函数的时间  let lastTime = 0  return function(...args) {    // 当前时间    let now = +new Date()    // 将当前时间和上一次执行函数时间对比    // 如果差值大于设置的等待时间就执行函数    if (now - lastTime > wait) {      lastTime = now      func.apply(this, args)    }  }}setInterval(  throttle(() => {    console.log(1)  }, 500),  1)复制代码

考虑一个场景,有一个按钮点击会触发网络请求,但是我们并不希望每次点击都发起网络请求,而是当用户点击按钮一段时间后没有再次点击的情况才去发起网络请求,对于这种情况我们就可以使用防抖。

// func是用户传入需要防抖的函数// wait是等待时间const debounce = (func, wait = 50) => {  // 缓存一个定时器id  let timer = 0  // 这里返回的函数是每次用户实际调用的防抖函数  // 如果已经设定过定时器了就清空上一次的定时器  // 开始一个新的定时器,延迟执行用户传入的方法  return function(...args) {    if (timer) clearTimeout(timer)    timer = setTimeout(() => {      func.apply(this, args)    }, wait)  }}复制代码

redux-thunk

这个函数的作用是改写redux的 dispatch,兼容异步action creator

function createThunkMiddleware(extraArgument) {// 这段写法的意思是: 相当于函数柯里化将多个参数层层包装// return function ({
// dispatch,// getState// }) {
// 根据上面redux源码 next就是 store.dispatch// return function (next) {
// 这个时候实际返回的dispatch就被改写成这个了: 参考redux源码:dispatch = compose(...chain)(store.dispatch)// return function (action) {
// 然后在这里传入action creator 就可以处理函数和对象两种情况下然后进行异步// if (typeof action === 'function') {
// return action(dispatch, getState, extraArgument);// }// return next(action);// }// }// } return ({ dispatch, getState }) => next => action => { //判断 if (typeof action === 'function') { return action(dispatch, getState, extraArgument); } return next(action); };}复制代码

这段函数的作用是在第一次调用当做中间件然后返回函数,第二次调用注入{ dispatch, getState },第三次调用的时候时候其实是注入原生dispatch,最后返回一个跟dispatch一样的函数,然后函数内部封装了对同步异步的处理。同步的化就调用了第三次执行的时候注入的原生dispatch,异步的话给action creator 返回的函数注入 第二次函数调用的时候注入的dispatch。

这样的好处是可以在不同的执行时期注入不同的参数,然后在最后整合成跟原来dispatch一致但其实已经修改过的函数。

转载于:https://juejin.im/post/5c7292cbf265da2d841088cb

你可能感兴趣的文章
windows server 2008中关于网络的进阶设定
查看>>
Python 并发编程(一)之线程
查看>>
苹果 vs AMD 高低互现
查看>>
手把手教你用C#打包应用程序(安装程序)
查看>>
软件架构设计模式简述
查看>>
模块化安装与删除openstack的dev(control、compute)与folsom(control)版本
查看>>
ISA系列之ISA Server 2004 中的新增功能--利用多个网络
查看>>
设计Unix下木马程序
查看>>
任务栏出现两个重复图标的解决办法
查看>>
AlphaZero完胜三大世界冠军棋类程序:5000个TPU、自学一天
查看>>
centos 查看每天应用程序的iowait
查看>>
.Net Micro Framework研究—中文显示
查看>>
修改虚拟机MAC地址的方法
查看>>
WINDOWS7更改访问windows共享的用户名和密码
查看>>
Mac下好用的批量文件扩展名修改工具
查看>>
配置gitlab环境实现代码管理及Web Hook测试和ldap认证
查看>>
几副工作对联@Alibaba
查看>>
五步教你使用JCS快速搭建缓存环境
查看>>
XenApp_XenDesktop_7.6实战篇之四:AD、DNS服务器高级配置
查看>>
利用IPSec使用策略和规则提升网络安全性
查看>>