快速搜索npmjs揭示了这个主题是如何成为JavaScript开发人员的核心。我曾经也有我的个人实用工具将Node.js基于回调的内部方法转换为返回承诺方法。
所以我想这对于使用node的每个人来说都是一个很大的好消息:Node.js正在添加一个新的实用程序,它的核心就是这个util.promisify。
如果您曾经使用过其中一个promisify模块,那么您将不会感到惊讶util.promisify; 他们几乎以同样的方式工作。
util.promisify接受Node.js回调样式(err, value) => ...后的函数,即将错误优先回调作为最后一个参数,并返回返回promises的版本。
但是你知道,代码片段胜过千言万语。
假设我想读取文件的内容。fs.readFile是此作业的工具,但其实现目前仅适用于回调:
const fs = require('fs');
fs.readFile('./notes.txt', (err, txt) => {
if (err) {
throw new Error(err.message);
}
console.log(txt);
});
如果我想要以Promise为基础fs.readFile,我有两个选择; 从npm中选择其中一个模块,或手动编写我的承诺fs.readFile。在这里,我想要第二个选项,只是为了展示在promisifier函数的漂亮抽象下发生了什么。
const fs = require('fs');
exports = module.exports =
(file, options) =>
new Promise((res, rej) => {
fs.readFile(file, options, (err, txt) => {
if (err) {
return rej(err.message);
}
res(txt);
});
});
这非常简单,但它不能很好地扩展......如果我需要更多使用promises的函数,我将不会使用这种方法。
我们可以考虑将承诺给定功能的能力提取到适当的效用中; 而这正是这些软件包的作者所做的......以及现在我们在核心中所拥有的东西,暴露为util.promisify。
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
readFile('./notes.txt')
.then(txt => console.log(txt));
util.promisify即使使用不将错误优先(err, value) => ...回调作为最后一个参数的方法,最终也可以工作。让我们考虑一下fs.exists(它现在已被弃用)。
fs.exists('/etc/passwd', (exists) => {
console.log(exists ? 'it\'s there' : 'no passwd!');
});
使用util.promisify.custom符号可以覆盖返回值util.promisify。
const fs = require('fs');
const exists = (file) =>
new Promise((res, rej) => {
fs.access(file, (err) => {
if (err) {
if (err.code === 'ENOENT') {
return res(false);
}
return rej(err);
}
res(true);
});
});
fs.exists[util.promisify.custom] = exists;
util.promisify(fs.exists) === exists; // true
这些天有可能使用本机Promise特别令人兴奋,因为对async / await的支持开始蔓延。
(async () => {
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
const txt = await readFile('./notes.txt');
console.log(txt);
})();
util.promisify计划首次发布,作为Node.js 8.0.0的第一个候选版本的一部分; 在这里你可以看到拉取请求进度,现在合并了。
网友评论