首頁 >web前端 >前端問答 >node同步與非同步的差異是什麼

node同步與非同步的差異是什麼

WBOY
WBOY原創
2022-04-19 17:25:473048瀏覽

node同步與非同步的差異是:同步就是程式自上而下的運行,上一步執行完後下一步才能得到執行;而異步是指不用等待上面的運行完後再運行下面的操作,非同步程式設計可以依託於回呼來實現,但並不是回呼後的程式就是非同步了。

node同步與非同步的差異是什麼

本教學操作環境:windows10系統、nodejs 12.19.0版本、Dell G3電腦。

node同步與非同步的區別是什麼

同步就是程式自上而下運行,而非同步就是不用等待上面的運行完後再運行下面的操作。非同步程式設計依託於回調來實現,但不能說使用了回調後程式就非同步化了。

同步的英文:sync(synchronization)

異步的英文:async(asynchronous)

同步API:只有目前API執行完成後,才能繼續執行下一個API

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

非同步API:目前API的執行不會阻塞後續程式碼的執行

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

同步API, 非同步API的差異( 取得返回值)

同步API可以從回傳值拿到API執行的結果, 但是非同步API是不可以的(好像在非同步API裡面寫return也是拿不到結果的?)

// 异步
  function getMsg () { 
      setTimeout(function () { 
          return { msg: 'Hello Node.js' }
      }, 2000);
  }
  const msg = getMsg (); //函数没有写return 默认是返回 undefined
cnsole.log(msg); // 输出的是 undefined,因为定时器还没执行完就执行了输出

回呼函數

自己定義函數讓別人去呼叫。

// getData函数定义
 function getData (callback) {}
  // getData函数调用
 getData (() => {});
/*例子------------------*/
function getMsg (callback) {
    setTimeout(function () {
        callback ({ msg: 'Hello Node.js' })
    }, 2000);
}
getMsg (function (msg) { 
    console.log(msg);
});

同步API, 非同步API的差異(程式碼執行順序)

#同步API從上到下依序執行,前面程式碼會阻塞後面程式碼的執行

非同步API不會等待API執行完成後再向下執行程式碼

程式碼執行順序分析

JavaScript分成同步程式碼執行區和非同步程式碼執行區,它們之間有回調函數隊列連接。首先,JavaScript會執行同步程式碼區的全部內容,然後再去非同步程式碼區執行程式碼,尋找非同步程式碼區執行完成的程式碼區塊,找到就馬上去找到這個非同步程式碼區塊對應的回呼函數放到同步程式碼執行區來執行

Node.js中的非同步API

讀取檔案API,有回呼函數。

事件監聽的API,也有回呼函數。 (事件處理函數就是回呼函數,事件監聽API就是非同步API)

如果非同步API後面程式碼的執行依賴目前非同步API的執行結果,但實際上後續程式碼在執行的時候異步API還沒有回傳結果,這個問題要怎麼解決呢?

例如有個需求:依序讀取A檔案、B檔案、C檔案(讀完A再讀B接著讀C,不能同時讀取)

如果實作上面這個需求就會導致將B讀取的操作放到A的回呼函數裡面,而讀取C的操作放到B的回呼函數裡面,導致嵌套層次很多(回調地獄)

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)
})
})
});

推薦學習:《 nodejs影片教學

以上是node同步與非同步的差異是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn