Node.js中的回調(diào)函數(shù),根據(jù)約定具有統(tǒng)一形式,(err, value)=>{}
,
因此,我們可以用統(tǒng)一的辦法,將接受這種回調(diào)函數(shù)作為參數(shù)的函數(shù),轉(zhuǎn)換為返回promise的函數(shù),
Node.js v8.0.0版本增加了util.promisify
函數(shù),用以實(shí)現(xiàn)這個(gè)功能。
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是計(jì)劃加入到ECMAScript 2017中的新特性,已經(jīng)在Node v7.6.0實(shí)現(xiàn)。
async function調(diào)用后會(huì)返回一個(gè)promise,await接受一個(gè)promise,并把promise resolved的值作為await表達(dá)式的值。
用戶(hù)可以自定義promisify的結(jié)果,
如果用戶(hù)設(shè)置了函數(shù)的util.promisify.custom
屬性值,
promisify會(huì)使用該屬性值,作為promisify的結(jié)果值。
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