Promises -解決Node無限回調(diào)

Promises 是異步代碼(如 Node.js) 實現(xiàn)控制流的方式, 可以讓代碼更干凈,可讀。
參考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");
        }
    }
});

轉(zhuǎn)化成

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 可以轉(zhuǎn)化已存在的 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 是一個單例. 大多數(shù)庫能夠通過 require 一些庫里的類(構(gòu)造函數(shù))和在 .prototype上調(diào)用 promisify 對該實例 promise 化.

每個實例的 promise 化在應用的生命周期內(nèi)只需被調(diào)用一次,此后依據(jù)該實例原來的文檔進行操作, 除了在方法后面增加Async 和用 promise 接口替代原來的 callback 接口.

// Mysql 模塊
var Promise = require("bluebird");
//
// 庫里面的類并不是模塊直接導出,所以需要手動的require
//
Promise.promisifyAll(require("mysql/lib/Connection").prototype);
Promise.promisifyAll(require("mysql/lib/Pool").prototype);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 英文:Nolan Lawson 譯文:伯樂在線專欄作者 - abell123如有好文章投稿,請點擊 → 這里了解...
    北方蜘蛛閱讀 6,338評論 1 10
  • 你不知道JS:異步 第三章:Promises 在第二章,我們指出了采用回調(diào)來表達異步和管理并發(fā)時的兩種主要不足:缺...
    purple_force閱讀 2,233評論 0 4
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,603評論 0 6
  • 這幾天仍然一直在讀《悲慘世界》。主人公冉·阿讓,一個可憐的窮人,為了姐姐的七個孩子去偷一塊面包,結(jié)果被判服苦役五年...
    陰天星閱讀 375評論 0 0
  • 筱筱是我現(xiàn)在的同事,我們一起共事按照年資來算的話有一年多的時間了,可是刨去她休婚假,休產(chǎn)假,再休產(chǎn)假這些日子,...
    云牽閱讀 141評論 0 0

友情鏈接更多精彩內(nèi)容