Node.js中的回调函数,根据约定具有统一形式,(err, value)=>{}
,
因此,我们可以用统一的办法,将接受这种回调函数作为参数的函数,转换为返回promise的函数,
Node.js v8.0.0版本增加了util.promisify
函数,用以实现这个功能。
const fs = require('fs');
const { promisify } = require('util');
const readFileAsync = promisify(fs.readFile);
async function read() {
const content = await readFileAsync('./test.js', 'utf-8');
return content;
}
read().then(v => {
console.log(v);
});
其中async functions是计划加入到ECMAScript 2017中的新特性,已经在Node v7.6.0实现。
async function调用后会返回一个promise,await接受一个promise,并把promise resolved的值作为await表达式的值。
用户可以自定义promisify的结果,
如果用户设置了函数的util.promisify.custom
属性值,
promisify会使用该属性值,作为promisify的结果值。
const fs = require('fs');
const util = require('util');
const fn = (param, callback) => { };
console.log(util.promisify(fn) === fn[util.promisify.custom]); //false
fn[util.promisify.custom] = () => { };
console.log(util.promisify(fn) === fn[util.promisify.custom]); //true
参考
Node.js 8: util.promisify()
Node.js Documentation: util.promisify
Releases: Node v7.6.0
tc39/proposals: Finished Proposals
MDN: async function
网友评论