JavaScript >> Javascript 文檔 >  >> Node.js

Node.js 中的異步性

非阻塞 I/O

與 Python 或 Ruby 相比,使用 Node.js 的最大優勢之一是 Node 具有非阻塞 I/O 機制。為了說明這一點,讓我以星巴克咖啡店的一條線為例。讓我們假設每個排隊喝酒的人都是一項任務,櫃檯後面的一切——收銀員、收銀員、咖啡師——都是服務器或服務器應用程序。當我們點一杯普通的滴漏式咖啡(如派克)或熱茶(如伯爵茶)時,咖啡師就會做出來。製作飲料時,整條隊伍都在等待,並向該人收取適當的費用。

Node.js 中的異步

當然,我們知道這類飲料很容易製作;只需倒入液體,就完成了。但是那些花哨的 choco-mocha-frappe-latte-soy-decafs 呢?如果排隊的每個人都決定點這些耗時的飲料怎麼辦?這條線會被每個訂單撐起,而且會越來越長。咖啡店的經理將不得不增加更多的收銀機並讓更多的咖啡師工作(甚至他/她自己站在收銀機後面)。這不好,對吧?但這幾乎是所有服務器端技術的工作原理,除了 Node.js。 Node 就像一個真正的星巴克。當您點菜時,咖啡師會向其他員工大喊訂單,然後您離開收銀台。當您在紙杯中等待您最先進的大開眼界時,另一個人會下訂單。線路移動,進程異步執行,不會因等待而阻塞隊列。

這就是為什麼 Node.js 在性能和可擴展性方面勝過其他一切(可能除了低級 C/C++)。使用 Node,您不需要那麼多 CPU 和服務器來處理負載。

異步編碼方式

對於熟悉 Python、PHP、C 或 Ruby 的程序員來說,異步性需要不同的思維方式。通過忘記用正確的 return 結束代碼的執行,很容易無意中引入錯誤 表達。

這是一個說明這種情況的簡單示例:

var test = function (callback) {
  return callback();  
  console.log('test') //shouldn't be printed
}

var test2 = function(callback){
  callback();
  console.log('test2') //printed 3rd
}

test(function(){
  console.log('callback1') //printed first
  test2(function(){
  console.log('callback2') //printed 2nd
  })
});

如果我們不使用 return callback() 而只使用 callback() 我們的字符串 test2 將會被打印出來(test 不會被打印出來)。

callback1
callback2
tes2

為了好玩,我添加了一個 setTimeout() callback2 字符串的延遲,現在順序已經改變:

var test = function (callback) {
  return callback();  
  console.log('test') //shouldn't be printed
}

var test2 = function(callback){
  callback();
  console.log('test2') //printed 2nd
}

test(function(){
  console.log('callback1') //printed first
  test2(function(){
    setTimeout(function(){
      console.log('callback2') //printed 3rd
    },100)
  })
});

打印:

callback1
tes2
callback2

最後一個例子說明了這兩個函數相互獨立並且並行運行。較快的功能將比較慢的功能更快完成。回到我們在星巴克的例子,你可能會比排在你前面的其他人更快地得到你的飲料。對人更好,對程序更好! :-)


Tutorial JavaScript 教程
  1. 如何在貓鼬中排除返回字段

  2. 如何在 Linux 上安裝 Node.js

  3. 幫助!如何將文件上傳到 S3

  4. 這是useState(或幾乎)的教程

  5. 在反應中從另一個組件調用這個函數很熱嗎?

  6. 在 Dokku Droplet 上設置 Vendure 電子商務 API

  7. 如何使用 React Native AsyncStorage

  1. 使用 Promise.allSettled 捕獲被拒絕的 Promise 的請求響應代碼

  2. JavaScript 對象鍵教程 – 如何使用 JS 鍵值對

  3. 最喜歡的 React/React 原生播客?

  4. 新的 Angular YouTube 播放器組件!

  5. 如何通過單次點擊從多個元素中獲取數據 ID?

  6. 不再有全局 Npm 包

  7. 閱讀片段 [11]

  1. Nix-Shell 如何拯救我們團隊的理智

  2. 10 反應示例

  3. 如何像專業人士一樣在 JavaScript 中使用數組?

  4. 終於了解 Javascript 中 this 的高級用法