当前位置:首页 > JavaScript

js实现promisify

2026-04-05 08:25:06JavaScript

实现 promisify 的方法

promisify 是一种将基于回调的函数转换为返回 Promise 的函数的技术。以下是几种实现方式:

基础实现

function promisify(fn) {
  return function(...args) {
    return new Promise((resolve, reject) => {
      fn(...args, (err, result) => {
        if (err) {
          reject(err);
        } else {
          resolve(result);
        }
      });
    });
  };
}

支持多个返回值

如果回调函数可能返回多个值,可以使用数组或对象来收集结果:

function promisify(fn) {
  return function(...args) {
    return new Promise((resolve, reject) => {
      fn(...args, (err, ...results) => {
        if (err) {
          reject(err);
        } else {
          resolve(results.length > 1 ? results : results[0]);
        }
      });
    });
  };
}

支持 this 绑定

如果被转换的函数依赖于 this 上下文,可以通过传递 thisArg 来绑定:

function promisify(fn, thisArg) {
  return function(...args) {
    return new Promise((resolve, reject) => {
      fn.call(thisArg, ...args, (err, result) => {
        if (err) {
          reject(err);
        } else {
          resolve(result);
        }
      });
    });
  };
}

使用 Node.js 内置 util.promisify

Node.js 提供了内置的 util.promisify 方法,可以直接使用:

const util = require('util');
const fs = require('fs');

const readFile = util.promisify(fs.readFile);
readFile('file.txt', 'utf8').then(data => console.log(data));

自定义 promisify 方法

如果需要更复杂的逻辑,可以扩展 promisify 方法:

function promisify(fn, options = {}) {
  return function(...args) {
    return new Promise((resolve, reject) => {
      const callback = (err, ...results) => {
        if (err) {
          reject(err);
        } else if (options.multiArgs) {
          resolve(results);
        } else {
          resolve(results[0]);
        }
      };
      fn.call(this, ...args, callback);
    });
  };
}

使用示例

fs.readFile 转换为 Promise

js实现promisify

const fs = require('fs');
const readFilePromise = promisify(fs.readFile);
readFilePromise('file.txt', 'utf8')
  .then(data => console.log(data))
  .catch(err => console.error(err));

注意事项

  • 确保回调函数的最后一个参数是回调函数。
  • 如果回调函数可能返回多个值,需要处理多个返回值的情况。
  • 如果函数依赖于 this 上下文,需要正确绑定 this

标签: jspromisify
分享给朋友:

相关文章

js实现

js实现

JavaScript 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…