餓了麼面試:https://elemefe.github.io/node-interview/#/sections/zh-cn/node
node流的概念:http://www.javashuo.com/article/p-zdxliltq-r.htmlgit
node的單線程github
node.js單線程只是一個js主線程,本質上的異步操做仍是由線程池完成的,node將全部的阻塞操做都交給了內部的線程池去實現,自己只負責不斷的往返調度,
並無進行真正的I/O操做,從而實現異步非阻塞I/O。
重點在主線程爲單線程,主線程執行代碼造成一個執行棧
主線程以外維護一個事件隊列,當IO或異步操做,會將事件放到Event queue中,並不會執行且繼續執行主線程代碼,不會阻塞,直到主線程代碼完畢。
主線程執行完畢,循環去取事件,用線程池線程去執行事件。當有事件執行完畢後,會通知主線程,主線程執行回調,線程歸還給線程池。面試
必定注意異步問題,可以使用promise,實現代碼以下數據庫
1 // 遇到須要同步執行的代碼,promise化,await執行,外層必定要有async 2 function formImage() { 3 return new Promise((resolve, reject) => { 4 form((opt, {fields, files})=> { 5 console.log(files) 6 let filename = files.file.name 7 console.log(files.file.path) 8 let uploadDir = config.ROOTPATH + `/tmp/${roomId}/` 9 let relativePath = `/tmp/${roomId}/` + Date.now() + '_' + filename 10 mkdirs(uploadDir, () => { 11 fs.renameSync(files.file.path, config.ROOTPATH + relativePath) //重命名 12 resolve(relativePath) 13 }) 14 }) 15 }) 16 } 17 let p = await formImage();
Node.js等則規定在JavaScript的回調函數的第一個參數爲 Error 對象,這也是它的一個慣例。
npm install packageName --save //安裝到項目目錄下,並在package.json文件的dependencies中寫入依賴,簡寫爲-S
數據類型symbol:爲了解決屬性名重複的問題,symbol值是經過symbol函數生成的,確定是獨一無二npm
class:constructor方法是類的默認方法,經過new命令生成對象實例時,自動調用該方法。一個類必須有constructor方法,若是沒有顯式定義,一個空的constructor方法會被默認添加。
調用要用 new Class()json
事件驅動的過程promise
全部的東西包裝成一個對象,執行了一個事件循環異步
事件驅動,把全部的東西都當成一個事件async
while(true){ // 無限循環 }
###不一樣的異步,不一樣的優先級
while(true){ 第一步: 執行script(所有的代碼) 先去清空micor-task隊列的事件,去把這裏面的所有執行完 再去找 setInterval 執行 再去清空micor-task隊列 再去找 setImmediate 執行,再去清空micor-task隊列 再去 I/O 操做 再去清空micro-task隊列 }
雖然都是異步,可是是有優先級的
macro-task:隊列 script(所有的代碼)
script(所有的代碼) setInterval() setTimeout() setImmediate() I/O操做(讀寫,查詢數據庫) 他們都是同步的,可是他們的回調函數是異步的
micro-task:隊列
process.nextTick() Promise().then()
注意 setInterval()和setTimeout()優先級是同樣的
異步事件的優先級
nextTick > Promise.then > setTimeout > setImmediate