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);