微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于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))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐