溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

node同步與異步的區(qū)別有哪些

發(fā)布時(shí)間:2022-04-19 17:34:26 來源:億速云 閱讀:272 作者:zzz 欄目:web開發(fā)

這篇“node同步與異步的區(qū)別有哪些”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“node同步與異步的區(qū)別有哪些”文章吧。

node同步與異步的區(qū)別是:同步就是程序自上而下的運(yùn)行,上一步執(zhí)行完后下一步才能得到執(zhí)行;而異步是指不用等待上面的運(yùn)行完后再運(yùn)行下面的操作,異步編程可以依托于回調(diào)來實(shí)現(xiàn),但并不是回調(diào)后的程序就是異步了。

本教程操作環(huán)境:windows10系統(tǒng)、nodejs 12.19.0版本、Dell G3電腦。

node同步與異步的區(qū)別是什么

同步就是程序自上而下運(yùn)行,而異步就是不用等待上面的運(yùn)行完后再運(yùn)行下面的操作。異步編程依托于回調(diào)來實(shí)現(xiàn),但不能說使用了回調(diào)后程序就異步化了。

同步的英文:sync(synchronization)

異步的英文:async(asynchronous)

同步API:只有當(dāng)前API執(zhí)行完成后,才能繼續(xù)執(zhí)行下一個(gè)API

console.log('before'); 
console.log('after');

異步API:當(dāng)前API的執(zhí)行不會(huì)阻塞后續(xù)代碼的執(zhí)行

console.log('before');
setTimeout(
   () => { console.log('last');
}, 2000);
console.log('after');

同步API, 異步API的區(qū)別( 獲取返回值 )

同步API可以從返回值中拿到API執(zhí)行的結(jié)果, 但是異步API是不可以的(好像在異步API里面寫return也是拿不到結(jié)果的?)

// 異步
  function getMsg () { 
      setTimeout(function () { 
          return { msg: 'Hello Node.js' }
      }, 2000);
  }
  const msg = getMsg (); //函數(shù)沒有寫return 默認(rèn)是返回 undefined
cnsole.log(msg); // 輸出的是 undefined,因?yàn)槎〞r(shí)器還沒執(zhí)行完就執(zhí)行了輸出

回調(diào)函數(shù)

自己定義函數(shù)讓別人去調(diào)用。

// getData函數(shù)定義
 function getData (callback) {}
  // getData函數(shù)調(diào)用
 getData (() => {});
/*例子------------------*/
function getMsg (callback) {
    setTimeout(function () {
        callback ({ msg: 'Hello Node.js' })
    }, 2000);
}
getMsg (function (msg) { 
    console.log(msg);
});

同步API, 異步API的區(qū)別(代碼執(zhí)行順序)

同步API從上到下依次執(zhí)行,前面代碼會(huì)阻塞后面代碼的執(zhí)行

異步API不會(huì)等待API執(zhí)行完成后再向下執(zhí)行代碼

代碼執(zhí)行順序分析

JavaScript分為同步代碼執(zhí)行區(qū)和異步代碼執(zhí)行區(qū),它們之間有回調(diào)函數(shù)隊(duì)列連接。首先,JavaScript會(huì)執(zhí)行同步代碼區(qū)的全部?jī)?nèi)容,然后再去異步代碼區(qū)執(zhí)行代碼,查找異步代碼區(qū)執(zhí)行完成的代碼塊,找到就馬上去找到這個(gè)異步代碼塊對(duì)應(yīng)的回調(diào)函數(shù)放到同步代碼執(zhí)行區(qū)來執(zhí)行

Node.js中的異步API

讀取文件API,有回調(diào)函數(shù)。

事件監(jiān)聽的API,也有回調(diào)函數(shù)。(事件處理函數(shù)就是回調(diào)函數(shù),事件監(jiān)聽API就是異步API)

如果異步API后面代碼的執(zhí)行依賴當(dāng)前異步API的執(zhí)行結(jié)果,但實(shí)際上后續(xù)代碼在執(zhí)行的時(shí)候異步API還沒有返回結(jié)果,這個(gè)問題要怎么解決呢?

比如有個(gè)需求:依次讀取A文件、B文件、C文件(讀完A再讀B接著讀C,不能同時(shí)讀取)

如果實(shí)現(xiàn)上面這個(gè)需求就會(huì)導(dǎo)致將B讀取的操作放到A的回調(diào)函數(shù)里面,而讀取C的操作放到B的回調(diào)函數(shù)里面,導(dǎo)致嵌套層次很多(回調(diào)地獄)

const fs = require('fs');
fs.readFile('./1.txt', 'utf8', (err, result1) => {
console.log(result1)
fs.readFile('./2.txt', 'utf8', (err, result2) => {
console.log(result2)
fs.readFile('./3.txt', 'utf8', (err, result3) => {
console.log(result3)
})
})
});

以上就是關(guān)于“node同步與異步的區(qū)別有哪些”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI