含義:
有非同步肯定會有同步
凡是回撥函數存在的,都是非同步程式碼
先執行同步程式碼,看到非同步程式碼後,將非同步程式碼放到非同步程式碼執行區(先不執行)
繼續執行同步程式碼,當所有的同步程式碼執行結束後,在執行非同步程式碼
非同步程式碼案例:
console.log('1'); setTimeout(()=>{ console.log('2秒後再執行...'); },2000); console.log('end');
程式執行完畢後的輸出結果:
1
恩德
2秒後再執行…
總結:程式碼會在執行中會依次執行,但執行到回撥函數,就會把回撥函數放入非同步程式碼執行區,先不執行,如果程式碼執行完後,再去依次執行放入非同步程式碼執行區。
同步程式碼行案例:
for(let i=0;i<10;i++){ console.log(i); } console.log('end');
程式執行完畢後的輸出結果:
0123456789
end
總結:同步程式碼,for迴圈無論執行多久,下面程式碼都要等待它執行完畢後才會執行。
nodejs 特點是單執行緒、非同步、非阻塞,如果程式碼邏輯涉及到多個回撥,就會出現非常可怕的程式碼,不利於後期的維護。
而非同步程式設計的作用就是提高效率,現在對程式越來越大,CPU和記憶體對壓力也越來越大,非同步可以讓電腦同時處理多個事務,所以需要非同步程式設計。
在我們專案當中,會出現一些問題,比如,拿不到值,是undefined,是因為非同步程式設計。
解決方案:回撥函數巢狀、 Promise、 await、async語法糖 變成同步
現在資料夾裡有1,2,3三個txt檔案,我們需要讀取這三個檔案,如果直接讀取第一遍可能順序對第二遍就會出現順序混亂的情況,所以我們需要處理非同步的問題,讓他按順序執行
使用回撥函數巢狀程式碼:
const fs=require('fs') const path =require('path') let p1=path.join('1.txt') let p2=path.join('2.txt') let p3=path.join('3.txt') fs.readFile(p1,'utf8',(err,data)=>{ if(err) throw err console.log(data) fs.readFile(p2,'utf8',(err,data)=>{ if(err) throw err console.log(data) fs.readFile(p3,'utf8',(err,data)=>{ if(err) throw err console.log(data) }) }) })
使用Promise程式碼:
// new promise 的作用:讓非同步程式碼馬上執行 const fs=require('fs') function readFile(path){ return new Promise((resolve,reject)=>{ fs.readFile(path,'utf8',(err,data)=>{ resolve(data) }) }) } let p1=readFile('1.txt') let p2=readFile('2.txt') let p3=readFile('3.txt') p1.then(result=>{ console.log(result) return p2 }).then(result=>{ console.log(result) return p3 }).then(result=>{ console.log(result) return p3 })
還可以使用 await、async語法糖 程式碼:
const path=require('path') const fs=require('fs') let p1=readFile('1.txt') let p2=readFile('2.txt') let p3=readFile('3.txt') var readfile=(path)=>{ return new Promise((resolve,reject)=>{ fs.readFile(path,'utf8',(err,data)=>{ resolve(data) }) }) } async function exec() { await readfile(p1).then(result => console.log(result)) await readfile(p2).then(result => console.log(result)) await readfile(p3).then(result => console.log(result)) } exec()
【推薦:】
以上就是深入理解NodeJs非同步程式設計的含義的詳細內容,更多請關注TW511.COM其它相關文章!