深入理解NodeJs非同步程式設計的含義

2022-08-08 18:02:19

首先理解什麼是非同步程式設計

含義:

  • 有非同步肯定會有同步

  • 凡是回撥函數存在的,都是非同步程式碼

  • 先執行同步程式碼,看到非同步程式碼後,將非同步程式碼放到非同步程式碼執行區(先不執行)

  • 繼續執行同步程式碼,當所有的同步程式碼執行結束後,在執行非同步程式碼

非同步程式碼案例:

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迴圈無論執行多久,下面程式碼都要等待它執行完畢後才會執行。

2.為什麼有非同步程式設計

nodejs 特點是單執行緒、非同步、非阻塞,如果程式碼邏輯涉及到多個回撥,就會出現非常可怕的程式碼,不利於後期的維護。

而非同步程式設計的作用就是提高效率,現在對程式越來越大,CPU和記憶體對壓力也越來越大,非同步可以讓電腦同時處理多個事務,所以需要非同步程式設計。

3.如何處理非同步程式設計出現的問題

在我們專案當中,會出現一些問題,比如,拿不到值,是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其它相關文章!