promisify在node中源码实现

我们都知道在node中提供的API可以分为同步实现和异步实现。但是同步一般会阻塞线程,所以我么会选择异步实现。通过实践我们知道node提供的异步API格式都是类似的,如果我们能像使用Promise一样调用node的API,岂不美哉。在node V12之后官方已经为我们实现了相关设计。今天我们就一步步来理解它的真相,并手动实现promisify。

基于回调实现

const fs = require('fs');


fs.readFile('./name.txt','utf8',(err,data)=>{
    if(err) throw err;
    console.log(data)
   })

官方Promise化

const fs = require('fs').promises;
fs.readFile('name.txt','utf8').then(data=>{
    console.log(data)
}).catch(err=>{
    console.log(err)
})


// 调试信息 低于v12下会有警告信息
[Running] node "f:\web全栈\js\异步编程\tempCodeRunnerFile.js"
(node:3372) ExperimentalWarning: The fs.promises API is experimental
age.txt

[Done] exited with code=0 in 0.396 seconds

手动实现promisify(柯里化)

// 1.高阶函数
// 2.返回一个Promise,后续可以.then操作


const promisify = fn => (...args) => new Promise((resolve,reject)=>{
    fn(...args,(err,data)=>{
        if(err) reject(err);
        resolve(data);
    })
})

// 使用如下
const fs = require('fs');
const read = promisify(fs.readFile);
read('name.txt','utf8').then(data=>{
    console.log(data)
})
// 调试结果
[Running] node "f:\web全栈\js\异步编程\tempCodeRunnerFile.js"
age.txt

[Done] exited with code=0 in 0.244 seconds

这就是node中promisify的实现方式,其实还是很好理解的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值