Fork me on GitHub

基于es6的promisify

es6原生支持了promise规范,可以使用new Promise()方法得到一个promise对象。

promise的简单使用

(() => new Promise((resolve, reject) => setTimeout(() => resolve('jianyong'), 2000)))().then(data => console.log(data))
1
2
上面一行恶心的代码等价于:

function getName() {
let p
p = new Promise(function (resolve, reject) {
setTimeout(function() {
resolve('jianyong')
}, 2000)
})
return p
}
getName().then(function (name) {
console.log(name)
})

异步操作promise化

nodejs中,很多函数都是异步执行,我们需写一个回调函数作为异步函数的最后一个参数传入。比如fs包中的readFile这样的异步函数。

require('fs').readFile('./test.js', 'utf-8', function (err, data) {
if (err) {
console.log(err)
}
console.log(data)
})

使用promise改造fs.readFile

function readfile() {
return new Promise(function (resolve, reject) {
require('fs').readFile('./test.js', 'utf-8', function (err, data) {
if (err) {
reject(err)
}
resolve(data)
})
})
}
readfile().then(function (data) {console.log(data)})

promise 化

如果每次遇到异步操作就需要像上面例子那样包裹改造一下岂不是很麻烦?!
可以使用下面脚本改造需要promisify的异步函数:

function promisify(f) {
return function () {
let args = Array.prototype.slice.call(arguments);
return new Promise(function (resolve, reject) {
args.push(function (err, result) {
if (err) reject(err);
else resolve(result);
});
f.apply(null, args);
});
}
}

使用示例:

stat = promisify(require('fs').stat)

stat('./test.js').then(data => console.log(data)).catch(err => console.log(err))

posted @ 2021-06-10 12:20  Kaicy  阅读(107)  评论(0编辑  收藏  举报