Promises -解决Node无限回调

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



然而 核心模块 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);

你可能感兴趣的:(Promises -解决Node无限回调)