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

19 # promisify:将回调方法 promise 化_第1张图片

19 # promisify:将回调方法 promise 化_第2张图片

或者可以使用 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);
});

19 # promisify:将回调方法 promise 化_第3张图片

实现一个 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);
});

19 # promisify:将回调方法 promise 化_第4张图片

你可能感兴趣的:(前端工程架构,javascript,promise)