首頁 >web前端 >js教程 >深入理解NodeJs非同步程式設計的含義

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

藏色散人
藏色散人轉載
2022-08-08 14:38:141865瀏覽

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

##意思:

  • 有非同步一定會有同步

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

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

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

非同步程式碼案例:

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(&#39;end&#39;);

程式執行完畢後的輸出結果:

0123456789
end

總結:同步程式碼,for迴圈無論執行多久,下面程式碼都要等待它執行完畢後才會執行。

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

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

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

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

在我們專案當中,會出現一些問題,例如,拿不到值,是undefined,是因為非同步程式設計。

解決方案:回呼函數巢狀、 Promise、 await、async語法糖變成同步

現在資料夾裡有1,2,3三個txt文件,我們需要讀取這三個文件,如果直接讀取第一遍可能順序對第二遍就會出現順序混亂的情況,所以我們需要處理異步的問題,讓他按順序執行

使用回調函數嵌套代碼:

const fs=require(&#39;fs&#39;)
const path =require(&#39;path&#39;)
let p1=path.join(&#39;1.txt&#39;)
let p2=path.join(&#39;2.txt&#39;)
let p3=path.join(&#39;3.txt&#39;)
fs.readFile(p1,&#39;utf8&#39;,(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中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除