Callback 转 Promise

情景

遇到有callback调用的函数,容易造成代码嵌套。

解决方法

node.js 8.0.0 版本中新增的一个工具 util.promisify,用于将有 callback 的函数转成返回 promise 的函数。

条件

  1. callback 是 error-first 模式、
  2. callback 是函数最后一个入参。

示例

1
2
3
4
5
6
7
8
9
const util = require('util');
const fs = require('fs');

const stat = util.promisify(fs.stat);
stat('.').then((stats) => {
// Do something with `stats`
}).catch((error) => {
// Handle the error.
});

等同于使用 async function:

1
2
3
4
5
6
7
8
9
const util = require('util');
const fs = require('fs');

const stat = util.promisify(fs.stat);

async function callStat() {
const stats = await stat('.');
console.log(`This directory is owned by ${stats.uid}`);
}

深入

暂时没看懂文档

参考

util.promisify 的那些事儿
Util | Node.js v8.17.0 Documentation