小虾虎鱼

小虾虎鱼

nodejs v8中使用util.promisify()

作者 禾惠 发表于 2017/06/10 22:37 ,最后修改于 2017/06/10 22:45

如果你曾经使用Javascript,你必须有经验的回调。Javascript以其内置的异步哲学而闻名。从标准内置模块到其他框架和库,回调无处不在。这就是在Javascript中完成异步编程。但是回调有一个黑暗的一面。这叫Callback Hells

回调地狱的解决方案是Promises。而不是通过回调同步返回值或传递结果,我们可以返回一个Promise,我们将来会返回一些值或错误。 有许多像好的库如Bluebird和Q可以用来处理Promise。但是内置的模块和很多其他库不能使用Promises。这些库能够将传统的回调方法转换为Promise,在Node v8中我们现在可以使用util.promisify来处理回调方法。根据Node.js的文档:

util.promisify 采用常见的Node.js回调方式,即以(err,value)=> ...回调为最后一个参数,并返回一个Promise。

看传统的例子:

const fs = require('fs');
fs.readFile('./index.js', 'utf8', (err, text) => {
    if (err) {
        console.log('Error', err);
    } else {
        console.log(text);
    }
});

现在这个例子可以用Promises写成如下:

const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
readFile('./index.js', 'utf8')
    .then((text) => {
        console.log(text);
    })
    .catch((err) => {
        console.log('Error', err);
    });

在这里我们习惯于util.promisifyfs.readFile转换为基于promise的方法。现在,而不是采取回调,readFile方法作为一个pormise。promise有两个方法,thencatchthen如果函数调用成功,则用于获取结果。而catch用于捕获错误。Promise的优点在于,我们可以使用异步的链式写法而不会陷入回调地狱。

结合asyncawait关键字,promise可以更容易处理。链式太长的话也会使程序难于阅读。asyncawait使它看起来更清洁。以下是Async&Await的上面的例子:

const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
async function doFile() {
    try {
        const text = await readFile('./index.js', 'utf8');
        console.log(text);
    } catch (err) {
        console.log('Error', err);
    }
}
doFile();

原文地址http://farzicoder.com/util-promisify-in-Node-js-v8/

我欣赏你的好品味~

打开支付宝扫一扫