We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
promisify 是 util 模块下新增的方法,该方法接收一个传统的使用 callback 风格 的函数,并返回该函数返回 promise 的版本。查看官方文档
promisify
util
传统的使用 callback 风格的函数诸如 fs.stat,接收若干参数,并且最后一个参数为 callback,该 callback 第一个参数总是 err。如下面的 sleep 函数:
fs.stat
callback
err
sleep
function sleep(timestamp, callback) { setTimeout(function () { callback(null, 'done'); }, timestamp); } // callback style sleep(3000, (err, value) => { if (err) { return console.log('err', err); } console.log(value); });
而使用 promisify 方法,可以生成一个返回 promise 的 sleep 函数:
const { promisify } = require('util'); function sleep(timestamp, callback) { setTimeout(function () { callback(null, 'done'); }, timestamp); } const promisified = promisify(sleep); promisified(3000).then(value => { console.log(value); }).catch(err => { console.log('err:', err); });
所以,理所当然地也能使用 async/await 写法:
async function main () { try { await promisified(3000); } catch (err) { console.log('err:', err); } } main();
上面的 callback 除了 err 只有一个参数 "done",所以直接作为 promise 的 value 返回了。而以下函数的 callback 接收两个以上参数,比如 dns.lookup 的参数为 err、address、family。
"done"
dns.lookup
此时 promisify 返回的 promise resolve 时将把除 err 外的参数整合到一个对象中作为 value。
const { promisify } = require('util'); const dns = require('dns'); const lookupAsync = promisify(dns.lookup); lookupAsync('nodejs.org') .then(obj => console.log(obj)); // { address: '104.20.22.46', family: 4 }
Node.js 内置的函数 promisify 会整合参数,但自定义的 original 函数不符合 callback 风格怎么办?如当上面的 sleep 函数的 callback 接收多个参数的时候。那么可以自行指定 promisify 版本。只需要将自定义的 promisify 版本赋值给 original 函数的 util.promisify.custom symbol 属性上。
util.promisify.custom
const { promisify } = require('util'); function sleep(timestamp, callback) { setTimeout(function () { callback(null, 'done', 'done2'); }, timestamp); } function asyncSleep(timestamp) { return new Promise((resolve, reject) => { setTimeout(function () { resolve({ arg1: 'done', arg2: 'done2', }); }, timestamp); }); } // 指定 promisify 版本 sleep[promisify.custom] = asyncSleep; const promisified = promisify(sleep); console.log(promisified === asyncSleep); // true promisified(3000).then(console.log).catch(console.log);
那么问题来了,如果让你实现一个 promisify 函数,你要如何实现?Node.js 的实现在 这里
The text was updated successfully, but these errors were encountered:
没奖竞猜:为什么内置函数可以把参数整合到一起呢?能用同样的方法让自定义函数也整合到一起吗?
Sorry, something went wrong.
No branches or pull requests
promisify
是util
模块下新增的方法,该方法接收一个传统的使用 callback 风格 的函数,并返回该函数返回 promise 的版本。查看官方文档基本用法
传统的使用 callback 风格的函数诸如
fs.stat
,接收若干参数,并且最后一个参数为callback
,该callback
第一个参数总是err
。如下面的sleep
函数:而使用
promisify
方法,可以生成一个返回 promise 的 sleep 函数:所以,理所当然地也能使用 async/await 写法:
callback 接收两个以上参数时
上面的 callback 除了 err 只有一个参数
"done"
,所以直接作为 promise 的 value 返回了。而以下函数的 callback 接收两个以上参数,比如dns.lookup
的参数为 err、address、family。此时 promisify 返回的 promise resolve 时将把除 err 外的参数整合到一个对象中作为 value。
自定义 promisify 版本
Node.js 内置的函数 promisify 会整合参数,但自定义的 original 函数不符合 callback 风格怎么办?如当上面的 sleep 函数的 callback 接收多个参数的时候。那么可以自行指定 promisify 版本。只需要将自定义的 promisify 版本赋值给 original 函数的
util.promisify.custom
symbol 属性上。最后
那么问题来了,如果让你实现一个 promisify 函数,你要如何实现?Node.js 的实现在 这里
The text was updated successfully, but these errors were encountered: