亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Node.js中同步和異步編程的區(qū)別及使用方法

 更新時(shí)間:2023年05月05日 09:19:49   作者:火木火木  
在Node.js中,同步和異步編程是兩種不同的處理方式。同步方式會(huì)阻塞程序的執(zhí)行,而異步方式則不會(huì)。通過(guò)掌握它們的區(qū)別和使用方法,可以更好地實(shí)現(xiàn)程序的性能優(yōu)化和功能擴(kuò)展。同時(shí),需要注意異步編程中的回調(diào)地獄問(wèn)題,使用Promise可以更好地處理異步編程

一、進(jìn)程和線程

代碼編寫(xiě)完畢在編譯的過(guò)程中計(jì)算機(jī)的內(nèi)存中會(huì)開(kāi)辟一個(gè)空間來(lái)存儲(chǔ)代碼,這個(gè)空間就相當(dāng)于是進(jìn)程,可以將進(jìn)程類比于工廠的廠房,但代碼相當(dāng)于原材料,但僅有廠房和原材料無(wú)法生產(chǎn),還需要工人進(jìn)行加工,工人則類比于線程

  • 線程(廠房):程序運(yùn)行的環(huán)境
  • 線程(工人):線程

二、同步和異步

程序的運(yùn)行分為同步和異步兩種;

同步

同步指的是事情按照順序執(zhí)行;例如早上起床,我們先刷牙,再洗臉,最后吃早餐,講究的是事情先后的執(zhí)行順序

通常情況下我們的程序時(shí)按照同步執(zhí)行的,即按照順序一條一條執(zhí)行,一條執(zhí)行完畢執(zhí)行下一條,如下所示:

/*
    同步
        - 通常情況下代碼都是自上而下的
*/
console.log("哈哈")
console.log("嘻嘻")
console.log("嘿嘿")

通過(guò)快捷鍵F5通過(guò)NodeJs在控制臺(tái)中打印輸出內(nèi)容為以上順序執(zhí)行的結(jié)果

哈哈
嘻嘻
嘿嘿

下面的代碼示例就是非常典型的同步結(jié)構(gòu)的代碼:

function sum(a, b){
    return a + b
}
console.log("第一行打印")
let result = sum(123, 234)
console.log(result)
console.log("第二行打印")

同步的特點(diǎn)是邏輯清晰、結(jié)構(gòu)簡(jiǎn)單、容易理解;

同步:

  • 通常情況下代碼都是自上而下一行一行執(zhí)行的
  • 前邊的代碼不執(zhí)行后邊的代碼也不會(huì)執(zhí)行
  • 同步的代碼執(zhí)行會(huì)出現(xiàn)阻塞的情況
  • 一行代碼執(zhí)行慢會(huì)影響到整個(gè)代碼的執(zhí)行

解決同步的問(wèn)題:

java python

- 通過(guò)多線程來(lái)解決

node.js

- 通過(guò)異步的方式來(lái)解決

阻塞

同步最大的問(wèn)題就是阻塞;

所謂的阻塞就是按順序執(zhí)行的代碼,前面不執(zhí)行完畢后面的代碼不會(huì)執(zhí)行;

function sum(a, b){
    let begin = Date.now()
    while(Date.now() - begin < 10000){
    }
    return a + b
}
console.log("第一行打印")
let result = sum(123, 234)
console.log(result)
console.log("第二行打印")

上述sum()執(zhí)行的時(shí)候會(huì)停頓10秒,10秒后才會(huì)返回結(jié)果,由于是同步執(zhí)行代碼,所以sum()會(huì)阻礙后面所有代碼的執(zhí)行,導(dǎo)致整個(gè)程序的執(zhí)行速度變慢

異步

- 一段代碼的執(zhí)行不會(huì)影響到其他程序

- 異步的問(wèn)題:

- 異步的代碼無(wú)法通過(guò)return來(lái)設(shè)置返回值

- 特點(diǎn):

1. 不會(huì)阻塞其他代碼的執(zhí)行

2. 需要通過(guò)回調(diào)函數(shù)來(lái)返回結(jié)果

- 基于回調(diào)函數(shù)的異步帶來(lái)的問(wèn)題

1. 代碼的可讀性差

2. 可調(diào)試性差

- 解決問(wèn)題:

- 需要一個(gè)東西,可以代替回調(diào)函數(shù)來(lái)給我們返回結(jié)果

- Promise是一個(gè)可以用來(lái)存儲(chǔ)數(shù)據(jù)的對(duì)象

Promise存儲(chǔ)數(shù)據(jù)的方式比較特殊;

這種特殊的方式使得Promise可以用來(lái)存儲(chǔ)異步調(diào)用的數(shù)據(jù)

在程序中,有些代碼的執(zhí)行速度很快,比如說(shuō):打印一個(gè)內(nèi)容、接受一個(gè)請(qǐng)求、發(fā)送一個(gè)響應(yīng)這些都是簡(jiǎn)單且能快速反應(yīng)的操作,但例如:讀寫(xiě)硬盤(pán)中的文件(I/O)操作這些就會(huì)非常的慢,如果在這些非常耗時(shí)的操作影響到能快速反應(yīng)的操作,這是我們不希望看到的

對(duì)于其他語(yǔ)言,例如java,處理這類問(wèn)題的方式簡(jiǎn)單粗暴,就是直接開(kāi)啟多線程,每一個(gè)線程處理一個(gè)事務(wù),避免相互干擾;

但是對(duì)于Node.js來(lái)說(shuō),它本身就是單線程的,那么如何處理這種情況,答案就是采用異步;當(dāng)我們?nèi)プx取一個(gè)比較大的文件時(shí),node先將指令發(fā)給計(jì)算機(jī),然后再由計(jì)算機(jī)去讀取文件,此時(shí)node的線程不是等待計(jì)算機(jī)數(shù)據(jù)返回,而是繼續(xù)向下執(zhí)行其他的操作,那么何時(shí)去獲取計(jì)算機(jī)讀取到的數(shù)據(jù)呢?等數(shù)據(jù)返回了我們?cè)偃プx取,這樣既不影響其他操作也可以正常的讀取到計(jì)算機(jī)上返回的數(shù)據(jù);

function sum(a, b){
    setTimeout(()=>{
        return a + b
    }, 10000)
}
console.log("第一行打印")
let result = sum(123, 234)
console.log(result)
console.log("第二行打印")

上述代碼中,我們將計(jì)算操作放到了setTimeout中,同樣是等待10s,但是setTimeout不會(huì)阻塞其他代碼的執(zhí)行,而是在10s之后將函數(shù)放到了任務(wù)隊(duì)列,這樣一來(lái)就可以很好的解決阻塞問(wèn)題。

但由于函數(shù)的返回值return到了setTimeout的回調(diào)函數(shù)中,此時(shí)我們?cè)僬{(diào)用sum() 就無(wú)法獲取到函數(shù)的計(jì)算結(jié)果了,因此后面調(diào)用sum()傳入實(shí)參的時(shí)候計(jì)算結(jié)果為undefined;

那么如何獲取異步代碼的執(zhí)行結(jié)果呢,只有通過(guò)回調(diào)函數(shù)了,異步代碼通常都需要一個(gè)回調(diào)函數(shù)作為參數(shù),當(dāng)異步代碼執(zhí)行完畢取得結(jié)果時(shí)候便可以將結(jié)果作為回調(diào)函數(shù)的參數(shù)進(jìn)行傳遞,這樣我們便可以在回調(diào)函數(shù)中來(lái)讀取結(jié)果,并完成后續(xù)操作

// 回調(diào)函數(shù):將函數(shù)作為參數(shù)傳遞
function sum(a, b, cb){
    setTimeout(()=>{
        cb(a + b)
    }, 10000)
}
console.log("第一行打印")
sum(123, 234, result => {
    console.log(result)
})
console.log("第二行打印")

問(wèn)題

異步通過(guò)回調(diào)函數(shù)解決運(yùn)算結(jié)果的傳遞問(wèn)題,但最大的問(wèn)題也來(lái)自于回調(diào)函數(shù),由于是異步執(zhí)行,回調(diào)函數(shù)無(wú)法直接通過(guò)返回值來(lái)返回執(zhí)行結(jié)果,想要取得結(jié)果必須通過(guò)回調(diào)函數(shù),

這樣就帶來(lái)一個(gè)問(wèn)題:如果我們有兩個(gè)異步操作需要先后執(zhí)行,一個(gè)異步操作依賴于上一個(gè)異步操作的結(jié)果,那么我們只能采取嵌套措施了

// 回調(diào)函數(shù):將函數(shù)作為參數(shù)傳遞
function sum(a, b, cb){
    setTimeout(()=>{
        cb(a + b)
    }, 10000)
}
console.log("11111")
sum(123, 234, result => {
    // 計(jì)算777與前兩個(gè)數(shù)的加和
    sum(result, 7, result => {
        // 拿結(jié)果再進(jìn)行求和操作
        sum(result, 8, result => {
            sum(result, 9, result => {
            })
        })
    })
})

上述的示例中,調(diào)用了4次sum,每一次都調(diào)用了之前的計(jì)算結(jié)果,后一個(gè)是依賴前運(yùn)算結(jié)果的;

這樣子就是“回調(diào)地獄",又名死亡金字塔,這還只是4次,現(xiàn)實(shí)的代碼可能比這更加復(fù)雜;

總之,異步提高了代碼運(yùn)行的效率,同樣也增加了代碼的復(fù)雜程度;

到此這篇關(guān)于Node.js中同步和異步編程的區(qū)別及使用方法的文章就介紹到這了,更多相關(guān)Node.js中同步和異步內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Node.js搭建小程序后臺(tái)服務(wù)

    Node.js搭建小程序后臺(tái)服務(wù)

    最近在做微信的應(yīng)用號(hào)小程序開(kāi)發(fā),小程序的后臺(tái)數(shù)據(jù)接口需要https安全請(qǐng)求,所以需要我的nodejs服務(wù)器能夠提供https的支持,現(xiàn)在就將整個(gè)https服務(wù)器的搭建過(guò)程說(shuō)一下
    2018-01-01
  • Node.js引入U(xiǎn)IBootstrap的方法示例

    Node.js引入U(xiǎn)IBootstrap的方法示例

    這篇文章主要介紹了Node.js引入U(xiǎn)IBootstrap的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Node.js利用斷言模塊assert進(jìn)行單元測(cè)試的方法

    Node.js利用斷言模塊assert進(jìn)行單元測(cè)試的方法

    最近在用Node寫(xiě)一個(gè)實(shí)時(shí)聊天小應(yīng)用,其中就用到了單元測(cè)試,所以死下面這篇文章主要給大家介紹了關(guān)于Node.js利用斷言模塊assert進(jìn)行單元測(cè)試的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-09-09
  • nodejs環(huán)境使用Typeorm連接查詢Oracle數(shù)據(jù)

    nodejs環(huán)境使用Typeorm連接查詢Oracle數(shù)據(jù)

    這篇文章主要介紹了nodejs環(huán)境使用Typeorm連接查詢Oracle數(shù)據(jù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Node.js實(shí)現(xiàn)爬取網(wǎng)站圖片的示例代碼

    Node.js實(shí)現(xiàn)爬取網(wǎng)站圖片的示例代碼

    本文將利用Node.js開(kāi)發(fā)一個(gè)小示例—爬取某圖片網(wǎng)站的圖片,文中涉及的知識(shí)點(diǎn)有https模塊、cheerio模塊、fs模塊和閉包,感興趣的可以了解一下
    2022-04-04
  • 10個(gè)最優(yōu)秀的Node.js MVC框架

    10個(gè)最優(yōu)秀的Node.js MVC框架

    這篇文章主要為大家詳細(xì)介紹了10個(gè)最優(yōu)秀的Node.js MVC框架,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 淺談Koa2框架利用CORS完成跨域ajax請(qǐng)求

    淺談Koa2框架利用CORS完成跨域ajax請(qǐng)求

    這篇文章主要介紹了淺談Koa2框架利用CORS完成跨域ajax請(qǐng)求,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • 一文詳解Node中的文件模塊與核心模塊

    一文詳解Node中的文件模塊與核心模塊

    這篇文章主要介紹了一文詳解Node?中文件模塊與核心模塊,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • M2實(shí)現(xiàn)Nodejs項(xiàng)目自動(dòng)部署的方法步驟

    M2實(shí)現(xiàn)Nodejs項(xiàng)目自動(dòng)部署的方法步驟

    這篇文章主要介紹了M2實(shí)現(xiàn)Nodejs項(xiàng)目自動(dòng)部署的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • node使用crypto模塊為用戶密碼加密

    node使用crypto模塊為用戶密碼加密

    本文主要介紹了node使用crypto模塊為用戶密碼加密,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評(píng)論