19 # promisify:将回调方法 promise 化

简介: 19 # promisify:将回调方法 promise 化

之前写个单独的方法去处理文件读取

function read(filename) {
    return new Promise((resolve, reject) => {
        fs.readFile(filename, "utf-8", function (err, data) {
            if (err) reject(err);
            resolve(data);
        });
    });
}

将 node 的 api 快速的转化成 promise 的形式

const fs = require("fs").promises;
fs.readFile("./file/age.txt", "utf-8").then((data) => {
    console.log("data---->", data);
});

这里使用 promises,fs.readFile 返回的是一个 promise

或者可以使用 node 的 util 工具里的 promisify 方法将回调方法 promise 化

const fs = require("fs");
const util = require("util");
let read = util.promisify(fs.readFile);
read("./file/name.txt", "utf-8").then((data) => {
    console.log("data---->", data);
});

实现一个 promisify 转换 node api 的方法

// 这里可以简写去掉return,(fn) => (...args) => new Promise,我这里就保留方便理解
const promisify = (fn) => {
    return (...args) => {
        return new Promise((resolve, reject) => {
            fn(...args, function (err, data) {
                if (err) reject(err);
                resolve(data);
            });
        });
    };
};

测试

const fs = require("fs");
let read = promisify(fs.readFile);
read("./file/name.txt", "utf-8").then((data) => {
    console.log("data---->", data);
});

目录
相关文章
|
9月前
|
前端开发
【面试题】吃透Promise?先实现一个再说(包含所有方法)(二)
【面试题】吃透Promise?先实现一个再说(包含所有方法)(二)
|
9月前
|
存储 运维 前端开发
【面试题】吃透Promise?先实现一个再说(包含所有方法)(一)
【面试题】吃透Promise?先实现一个再说(包含所有方法)(一)
|
3月前
|
前端开发 索引
Promise.all() 方法的参数可以是什么类型?
综上所述,`Promise.all()` 方法的参数类型较为灵活,但无论使用哪种类型的可迭代对象作为参数,其核心的异步操作处理逻辑和成功失败的判断机制都是一致的,都是为了方便地处理多个异步操作的并发执行和结果汇总。
|
3月前
|
存储 前端开发
除了 Promise.all(),还有哪些方法可以处理异步并发操作?
在上述示例中,`concurrentPromises` 函数接受一个Promise数组和最大并发数作为参数,通过手动控制并发执行的Promise数量,实现了对异步操作的并发控制,并在所有Promise完成后返回结果数组。
|
1月前
|
前端开发 JavaScript
除了使用Polyfill,还有其他解决Promise.allSettled()兼容性问题的方法吗?
除了使用Polyfill,还有其他解决Promise.allSettled()兼容性问题的方法吗?
121 81
|
1月前
|
前端开发 JavaScript
Promise.allSettled()方法的语法是什么?
Promise.allSettled()方法的语法是什么?
141 79
|
1月前
|
Web App开发 前端开发 JavaScript
Promise.allSettled()方法的兼容性如何?
Promise.allSettled()方法的兼容性如何?
165 75
|
3月前
|
监控 调度
在什么情况下应该使用 Promise.allSettled() 方法?
总的来说,`Promise.allSettled()` 为我们处理多个异步任务提供了一种更灵活、更全面的方式,使我们能够更好地应对各种复杂的情况,确保在获取到所有任务结果的同时,能够进行更有效的后续处理和决策。
|
3月前
|
前端开发
Promise.allSettled()方法和Promise.race()方法有什么区别?
`Promise.allSettled()` 提供了一种更全面、更详细的方式来处理多个 `Promise`,而 `Promise.race()` 则更强调速度和竞争。我们需要根据具体的需求来选择使用哪种方法。
|
3月前
|
前端开发 索引
Promise.all() 方法的参数可以是哪些数据类型?
`Promise.all()` 方法的参数具有很大的灵活性,可以适应多种不同的场景和需求,方便地处理多个异步操作的并发执行和结果汇总。