##意思:
非同步程式碼案例:
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迴圈無論執行多久,下面程式碼都要等待它執行完畢後才會執行。
解決方案:回呼函數巢狀、 Promise、 await、async語法糖變成同步
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()【推薦:
node.js影片教學】
以上是深入理解NodeJs非同步程式設計的含義的詳細內容。更多資訊請關注PHP中文網其他相關文章!