Promises 是异步代码(如 Node.js) 实现控制流的方式, 可以让代码更干净,可读。
参考bluebirkjs
利用 Promises 可以将
fs.readFile("file.json", function (err, val) {
if (err) {
console.error("unable to read file");
}
else {
try {
val = JSON.parse(val);
console.log(val.success);
}
catch (e) {
console.error("invalid json in file");
}
}
});
转化成
fs.readFileAsync("file.json").then(JSON.parse).then(function (val) {
console.log(val.success);
})
.catch(SyntaxError, function (e) {
console.error("invalid json in file");
})
.catch(function (e) {
console.error("unable to read file");
});
</br>
然而 核心模块 fs
并没有 readFileAsync
方法, 可以使用 promisfication 大法.
Promisfication
Promisfication 可以转化已存在的 promise-unaware API 为 promise-returning API
通常 Node 使用 promises 的办法是去 Promise.promisifyAll
一些 API
var fs = require("fs");
Promise.promisifyAll(fs);
fs.readFileAsync("file.js", "utf8").then(...)
要注意到这是特殊状况, 因为 fs
是一个单例. 大多数库能够通过 require
一些库里的类(构造函数)和在 .prototype
上调用 promisify 对该实例 promise 化.
每个实例的 promise 化在应用的生命周期内只需被调用一次,此后依据该实例原来的文档进行操作, 除了在方法后面增加Async 和用 promise 接口替代原来的 callback 接口
.
// Mysql 模块
var Promise = require("bluebird");
//
// 库里面的类并不是模块直接导出,所以需要手动的require
//
Promise.promisifyAll(require("mysql/lib/Connection").prototype);
Promise.promisifyAll(require("mysql/lib/Pool").prototype);