Node.js 8 提供了新的工具函数:util.promisify,用于把形如 (err, value) => ... 的回调式函数转换为 Promise 版本。
基本使用 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.
});
复制代码
当然,也可以使用 Node 8 另一个新功能 async function 调用:
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});
}
复制代码
自定义函数的 Promise 版本
通过设置 util.promisify.custom symbol,可以自定义 util.promisify() 的返回值:
const util = require('util');
function doSomething(foo, callback) { // ... }
doSomething[util.promisify.custom] = (foo) => { return getPromiseSomehow(); };
const promisified = util.promisify(doSomething);
console.log(promisified === doSomething[util.promisify.custom]); // prints 'true' 复制代码 自定义 Promise symbol 一般用于源函数不遵循 (err, value) => ... 回调的场景,比如 (foo, onSuccessCallback, onErrorCallback) 式回调的函数:
doSomething[util.promisify.custom] = (foo) => { return new Promise((resolve, reject) => { doSomething(foo, resolve, reject); }); }; 复制代码