自己写的promisify

自己写的promisify

包装函数

function pmsify(fun) {
  return function (...arg) {
    return new Promise((resolve, reject) => {
      if (arg.length >= fun.length - 1) {
        fun(...arg, (err, data) => {
          if (err) {
            reject(err);
          } else {
            resolve(data);
          }
        });
      }
    });
  };
}

说明

  • 每个异步函数都要是单任务的,内部不要再包含其他异步的任务。
  • 回调函数使用nodejs的规范,为callback(err, data)。
    只能向后传递一个参数data(可以是对象、数组等结构化的参数)。
  • 在每个异步函数出口的地方写回调。

实例代码

const fs = require("fs");

let fr = pmsify(fs.readFile); //包装nodejs异步函数

fr("./1.txt", "utf8")
  .then((data) => {
    console.log("step1");
    console.log(data);
  })
  .then(() => {
    return fr("./2.txt", "utf8");
  })
  .then((data) => {
    console.log("step2");
    console.log(data);
  })
  .then(() => {
    return fr("./3.txt", "utf8");
  })
  .then((data) => {
    console.log("step3");
    console.log(data);
  })
  .catch((err) => {
    console.log(err);
  });

输出,

step1
this is 1.txt.
step2
this is 2.txt.
step3
this is 3.txt.

如果出错,也可以捕捉到,

step1
this is 1.txt.
step2
this is 2.txt.
[Error: ENOENT: no such file or directory, open 'C:\33.txt'] {
  errno: -4058,
  code: 'ENOENT',C
  syscall: 'open',
  path: 'C:\\33.txt'
}

优化

  • 对函数的实参数量不要求,只保证最后一个参数是回调函数。
function pmsify(fun) {
  return function (...arg) {
    return new Promise((resolve, reject) => {
      arg.length = fun.length - 1; //last parameter is callback function.
      fun(...arg, (err, data) => {
        if (err) {
          reject(err);
        } else {
          resolve(data);
        }
      });
    });
  };
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值