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,403評論 0 6
  • 這幾天仍然一直在讀《悲慘世界》。主人公冉·阿讓,一個可憐的窮人,為了姐姐的七個孩子去偷一塊面包,結果被判服苦役五年...
    陰天星閱讀 370評論 0 0
  • 筱筱是我現在的同事,我們一起共事按照年資來算的話有一年多的時間了,可是刨去她休婚假,休產假,再休產假這些日子,...
    云牽閱讀 122評論 0 0