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

</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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 英文:Nolan Lawson 译文:伯乐在线专栏作者 - abell123如有好文章投稿,请点击 → 这里了解...
    北方蜘蛛阅读 6,288评论 1 10
  • 你不知道JS:异步 第三章:Promises 在第二章,我们指出了采用回调来表达异步和管理并发时的两种主要不足:缺...
    purple_force阅读 2,122评论 0 4
  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,413评论 0 6
  • 这几天仍然一直在读《悲惨世界》。主人公冉·阿让,一个可怜的穷人,为了姐姐的七个孩子去偷一块面包,结果被判服苦役五年...
    阴天星阅读 370评论 0 0
  • 筱筱是我现在的同事,我们一起共事按照年资来算的话有一年多的时间了,可是刨去她休婚假,休产假,再休产假这些日子,...
    云牵阅读 122评论 0 0