nodejs異步編程詳解

1、從一個簡單的案例開始

fs.readdir(path.join(__dirname, './index.js'), (err, files) => {
    files.foreach((filename, index) => {
        fs.readFile((filename, 'utf-8', (err, file) => {
            ...
        }))
    })
})

nodejs 特色是單線程、異步、非阻塞,若是代碼邏輯涉及到多個回調,就會出現很是可怕的代碼,不利於後期的維護。前端

2、 nodejs爲何會設計成異步編程?

異步編程是隨着ajax才火的,因此最熟悉異步編程的就是前端工程師。但在其餘編程語言中,異步並很少見,PHP從頭至尾就是同步阻塞來執行的,這致使它在複雜的網絡應用中沒法更好的併發。固然咱們並非在批判PHP,畢竟PHP是世界上最好的語言。PHP代碼設計成同步有利於程序員順序編寫業務邏輯,這個有點是不能忽視的。node

js就是異步的,瀏覽器在執行js與UI渲染共用一個進程,若是js採用同步編程,會十分影響用戶體驗。爲何js不是多線程呢?首先建立線程和執行線程上下文切換的開銷較大,其次多線程編程常常面臨鎖、狀態同步等問題。js單線程的編寫方式比較符合人按順序思考的方式,是主流的編程方式。可是單線程沒法對硬件資源充分的利用,node利用單線程,遠離多線程、狀態同步等問題,利用異步I/O,讓單線程遠離阻塞,以更好的利用CPU。node提供來相似於前端的Web Workers子進程來高效利用CPU。node基於事件循環的執行模式,使得回調函數十分廣泛,對於通常的非異步的回調函數,函數由咱們自行調用。程序員

3、異步編程的難點

1.異常的處理web

node一般會將異常做爲回調函數的第一個實參傳回,若是第一個參數爲null,那麼就說明異步調用沒有異常拋出。ajax

2.回調函數嵌套過深編程

開頭的案例展現來多層回調的嵌套,致使代碼很是難理解,可是如今能夠經過 Promise、Generators、async函數解決。
其餘還有多線程編程、異步轉同步等。瀏覽器

4、異步編程解決方案

1.Promise/Deferred模式網絡

Promise/Deferred模式必定程度上緩解了嵌套回調的問題,Promise只會處在未完成、完成態、失敗態中的一種,只會從未完成轉化爲完成態或者失敗態,不能逆轉。且完成態和失敗態不能相互轉化。前端工程師

Promise對象具有then方法,接受完成態、失敗態的調用,只接受function對象,其他對象將被忽略。then方法繼續返回Promise對象,以實現鏈式調用。多線程

function asyncFunction() {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve('Async Hello world');
        }, 16);
    });
}

asyncFunction().then(function (value) {
    console.log(value);    // => 'Async Hello world'
}).catch(function (error) {
    console.log(error);
});//基本的使用

更新中

相關文章
相關標籤/搜索