JavaScript函数式编程Thunk原理解析

 更新时间:2022年08月18日 10:13:39   作者:掘金  
这篇文章主要为大家介绍了JavaScript函数式编程Thunk原理示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

本篇带来 Thunk 理解,这也是本瓜最津津乐道的 JS 函数式编程中延迟处理的思想核心之一!

什么是 Thunk ?

简单理解:在计算机编程中,Thunk 就是一种实现延迟执行的手段。

举个栗子🌰🌰🌰

我要计算 99 的 9 次方,然后再把它打印出来,你会怎么写?

大聪明肯定是直接一句话:

console.log(Math.pow(99, 9)) // 913517247483640800

有点想法的同学肯定想封装一个函数,因为后续还可能要 88 的 8 次方、77 的 7 次方等等:

const power = (base, exponent) => {
  return Math.pow(base, exponent);
};
console.log(power(99, 9)); // 913517247483640800

如果还有更多想法,可能会考虑:

今天你让我 console 打印结果,明天如果让我 alert 弹窗提醒结果怎么办?后天又让我 handleXXX 处理结果,又该怎么办?

所以,这里可以设计一个(可自定义的)回调函数来处理这个运算结果:

代码演进

const power = (base, exponent,callback) => {
  return callback(Math.pow(base, exponent))
};
const powerThunk = (callback) => {
  return function () {
    power(99, 9, callback);
  };
};
const calculatePower = powerAsyncThunk((result) => console.log(result));
calculatePower(); // 913517247483640800

在这个例子中,调用powerThunk() 并不会马上执行 power() 运算,这就是所谓的延迟执行。

并且 powerThunk() 只用再传一个回调函数进去就行了,不用再传 base 99 和 exponent 9 这两个参数了。

在某种意义上来讲,thunk 也是一个已经固定某些参数的一个函数,上例中 power 要传 3 个参数,而 powerThunk 只用传一个参数就行了。这感觉就有点像柯里化。

可能有同学问了:

“我就喜欢直接修改,不喜欢封装,行吗?”

“行呀,咋不行,即使自己不做封装,你也在无时无刻地用这种封装。Promise 就是基于 Thunk。”

继续上面的例子讲:

改造成异步

上面的例子是同步的,我们改造成异步的:

const fetchCurrenciesData = (callback) => {
  fetch("https://cdn.jsdelivr.net/gh/fawazahmed0/currency-api@1/latest/currencies.json")
  .then(res => res.json())
  .then(res => callback(res));
}
// This is an async thunk
const asyncThunk = (callback) => {
  return function () {
    fetchCurrenciesData(callback);
  }
}
// This async thunk now returns a function that 
// can be called later on to fetch data from the API.
const fetchCurrencies = asyncThunk((res) => console.log(res));
fetchCurrencies();

当我们调用 fetchCurrencies() 时,会执行 fetchCurrenciesData((res) => console.log(res))()

就会按序执行 fetch 方法,然后走 .then 处理成 json,然后打印。

toThunk 工具函数

一套嵌一套,母猪带熊罩。所以,我们可以写出一个 toThunk 工具函数:

function toThunk(asyncFn) {
  return (...args) => {
    return (callback) => {
      asyncFn(...args, callback);
    };
  };
}

可以将任何函数处理做成上述的逻辑:

let thunk = toThunk(readFile); // readFile 是异步函数
thunk = thunk('./foo');
thunk((err, data) => /* do sth. */))

thunk 的两步执行,第一步传入参数,第二步是传入回调函数,这就是 Promise 的 then 的方法思路!!

thunk 还可以搭配 es6 生成器使用,本篇就不作展开。

JavaScript 中「Thunk」怎么理解,你 get 到了吗?

以上就是JavaScript函数式编程Thunk原理解析的详细内容,更多关于JavaScript函数式编程Thunk的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript事件委托原理

    JavaScript事件委托原理

    这篇文章主要介绍了JavaScript事件委托原理, 事件委托也称为事件代理。就是利用事件冒泡,把子元素的事件都绑定到父元素上。如果子元素阻止了事件冒泡,那么委托就无法实现,下面我们一起来学习文章的具体详细内容吧
    2021-12-12
  • 一文详解js基本类型与引用类型的区别

    一文详解js基本类型与引用类型的区别

    这篇文章主要为大家介绍了js基本类型与引用类型的区别详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 超越Node.js的JavaScript运行环境Bun.js功能特性详解

    超越Node.js的JavaScript运行环境Bun.js功能特性详解

    这篇文章主要为大家介绍了超越Node.js的JavaScript运行环境Bun.js功能特性详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 微信小程序-getUserInfo回调的实例详解

    微信小程序-getUserInfo回调的实例详解

    这篇文章主要介绍了微信小程序-getUserInfo回调的实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • Web项目如何配置Eslint过程详解

    Web项目如何配置Eslint过程详解

    这篇文章主要为大家介绍了Web项目如何配置Eslint过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 插件导致ECharts被全量引入的坑示例解析

    插件导致ECharts被全量引入的坑示例解析

    这篇文章主要为大家介绍了插件导致ECharts被全量引入的坑示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 微信小程序 数据访问实例详解

    微信小程序 数据访问实例详解

    这篇文章主要介绍了微信小程序 数据访问实例详解的相关资料,需要的朋友可以参考下
    2016-10-10
  • JS前端模拟Excel条件格式实现数据条效果

    JS前端模拟Excel条件格式实现数据条效果

    这篇文章主要为大家介绍了JS前端模拟Excel条件格式实现数据条效果,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • JS代码的格式化和压缩

    JS代码的格式化和压缩

    JS代码的格式化和压缩...
    2006-06-06
  • fetch-event-source库使用源码学习

    fetch-event-source库使用源码学习

    这篇文章主要为大家介绍了fetch-event-source库源码学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09

最新评论