极客时间返利平台,你可以在上边通过山月的链接购买课程,并添加我的微信 (shanyue94) 领取返现。
山月训练营之面试直通车 服务上线了,从准备简历、八股文准备、项目经历准备、面试、面经、面经解答、主观问题答复、谈薪再到入职的一条龙服务。

# 实现函数 promisify,把回调函数改成 promise 形式

Issue

欢迎在 Gtihub Issue 中回答此问题: Issue 723 (opens new window)

Author

回答者: Asarua (opens new window)

function promisify(fn) {
  return function (...args) {
    let hasCb = args.some((v) => typeof v === "function");
    if (hasCb) {
      fn(...args);
    } else {
      return new Promise((resolve, reject) => {
        fn(...args, cb);

        function cb(err, data) {
          if (err) {
            reject(err);
          } else {
            resolve(data);
          }
        }
      });
    }
  };
}

首先明确 nodeCallback 的规范: 1、回调函数在主函数参数的位置是最后一个 2、回调函数的第一个参数是 error 例如

function main(err, b, c, callback) {
  let data = b+c
  callback(err,data)
 }

所以实现的思路就是: 把结果由原先的放在 callback 中返回,改成放在 Promise 中返回

const promisify = (fnc) => (...args) => {
  return new Promise((resolve, reject) => {
    fnc.call(this, ...args, function (err, data) {
      if (err) {
        reject(err);
      } else {
        resolve(data);
      }
    });
  });
};

测试结果:

var func1 = function (a, b, c, callback) {
  let rst = a + b + c;
  callback(null, rst);
};
var func2 = promisify(func1);
func2(1, 2, 3).then((rst) => {
  console.log("rst", rst);
}); //输出6
Last Updated: 1/2/2022, 8:04:55 PM