Promise 化回调式函数

304 阅读1分钟

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); }); }; 复制代码