fs.readdir(path.join(__dirname, './index.js'), (err, files) => { files.foreach((filename, index) => { fs.readFile((filename, 'utf-8', (err, file) => { ... })) }) })
nodejs 特色是單線程、異步、非阻塞,若是代碼邏輯涉及到多個回調,就會出現很是可怕的代碼,不利於後期的維護。前端
異步編程是隨着ajax才火的,因此最熟悉異步編程的就是前端工程師。但在其餘編程語言中,異步並很少見,PHP從頭至尾就是同步阻塞來執行的,這致使它在複雜的網絡應用中沒法更好的併發。固然咱們並非在批判PHP,畢竟PHP是世界上最好的語言。PHP代碼設計成同步有利於程序員順序編寫業務邏輯,這個有點是不能忽視的。node
js就是異步的,瀏覽器在執行js與UI渲染共用一個進程,若是js採用同步編程,會十分影響用戶體驗。爲何js不是多線程呢?首先建立線程和執行線程上下文切換的開銷較大,其次多線程編程常常面臨鎖、狀態同步等問題。js單線程的編寫方式比較符合人按順序思考的方式,是主流的編程方式。可是單線程沒法對硬件資源充分的利用,node利用單線程,遠離多線程、狀態同步等問題,利用異步I/O,讓單線程遠離阻塞,以更好的利用CPU。node提供來相似於前端的Web Workers子進程來高效利用CPU。node基於事件循環的執行模式,使得回調函數十分廣泛,對於通常的非異步的回調函數,函數由咱們自行調用。程序員
1.異常的處理web
node一般會將異常做爲回調函數的第一個實參傳回,若是第一個參數爲null,那麼就說明異步調用沒有異常拋出。ajax
2.回調函數嵌套過深編程
開頭的案例展現來多層回調的嵌套,致使代碼很是難理解,可是如今能夠經過 Promise、Generators、async函數解決。
其餘還有多線程編程、異步轉同步等。瀏覽器
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); });//基本的使用