成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Node.js中的異步Generator函數和Websockets

開發 前端
在這篇文章中,我將說明 Node.js websocket 框架將如何使用異步 generator 函數。

[[387974]]

 異步 generator 函數是 ES2018 中新增的特性。Node.js 從 v10 版本增加了對異步 generator 函數的支持。異步 generator 函數看似一個相當小眾特性特性,但是卻為 node.js websocket 框架提供了一個靈巧的使用機會。

在這篇文章中,我將說明 Node.js websocket 框架將如何使用異步 generator 函數。

HTTP 框架分類

首先,想一下 Express 或 Hapi 之類的 HTTP 服務器框架。一般來說,大多數 HTTP 服務器框架都屬于以下三種之一:

    1.  顯式響應。 在 Express 中發送一個 HTTP 響應,你必須調用 res.end(),res.json() 或者 res 對象上的一些其他方法。換句話說,你必須顯式調用一個方法來發送一個響應。

    2.  使用 return 隱式響應。 另一方面,Hapi 在 v17 中明確地刪除了 reply() 函數,也就是說 Hapi 沒有等同于 res 的方式。如果需要發送一個響應。你只需在請求的處理方法中 return 一個返回值。之后 Hapi 就會將 return 的值封裝進一個 HTTP 響應中。

    3.  在適當的位置修改響應。  Koa 使用了一種混合了以上兩種實現的獨特處理方式。你將以修改 ctx 對象的方式,替代調用 res 對象的方法來構建響應。

換句話說,一些 HTTP 框架要求你顯式調用方法來發送 HTTP 響應,另一些框架會提供給你一個可更改的 HTTP 響應對象,還有一些框架僅需要處理函數中 return 一個值。

Websockets 和 HTTP 的區別在于,Websockets 服務器可以在任何時間向 socket 推送消息,不管是不是基于某條消息的響應。也就是說,初級的 websocket 框架,例如 ws, 看起來很像 “顯式響應” 模式:你需要顯式調用一個方法用于發送一條消息。

然而,是否可以在保持允許消息多發這個優點的同時,使 websockets 可以實現隱式響應?這就是異步 generator 產生的原因。

從服務器上讀取大塊數據

假設你有一個一次讀取一堆文檔的 Mongoose 指針,并且你希望用 websocket 在每一個文檔讀出時盡快將它發送出去。這種方式有助于在任何時刻都使服務器的內存使用量保持在最小:客戶端可以獲取所有的數據,而服務器卻不用為此在內存中一次保存所有的數據。舉個例子,這是使用 async/await 方式讀取一個指針的實現: 

  1. const User = mongoose.model('User', mongoose.Schema({ name: String }));  
  2. const cursor = Model.find().cursor();  
  3. for await (const doc of cursor) {  
  4.   console.log(doc.name); // Print user names 1 by 1.  

使 generator 函數變得有趣的地方在于,在一個函數中 yield 方法可以被調用多次,并且在上次停止的地方繼續運行,除了這點以外,yield 方法和 return 方法類似。 

  1. const User = mongoose.model('User', mongoose.Schema({ name: String }));  
  2. async function* streamUsers() {  
  3.   const cursor = Model.find().cursor();  
  4.   for await (const doc of cursor) {  
  5.     // Yielding each doc behaves like multiple implicit responses, if you have  
  6.     // a framework that supports it.  
  7.     yield doc;  
  8.   }  

以下是如何使用 Node.js 編寫一個 Websocket 服務器: 

  1. const WebSocket = require('ws');  
  2. const server = new WebSocket.Server({  
  3.   port: 8080  
  4. });  
  5. server.on('connection', function(socket) {  
  6.   socket.on('message', function(msg) {  
  7.     // Handle message 
  8.   });  
  9. }); 

至此,接下來要做的是為 websocket 服務器添加 streamUsers() 方法。假設收到的每條消息都是有效的 JSON,并且都有屬性 action 和 id。當 action === 'streamUsers'時,streamUsers() 就會被執行,并且基于 socket 向外發送每個被 Mongoose cursor 查詢出來的用戶。 

  1. const WebSocket = require('ws');  
  2. const server = new WebSocket.Server({  
  3.   port: 8080  
  4. });  
  5. server.on('connection', function(socket) { 
  6.   socket.on('message', function(msg) {  
  7.     msg = JSON.parse(msg);  
  8.     if (msg.action === 'streamUsers') {  
  9.       void async function() {  
  10.         // Send 1 message per user, as opposed to loading all users and then  
  11.         // sending them all in 1 message.  
  12.         for await (const doc of streamUsers()) {  
  13.           socket.send(JSON.stringify({ id: msg.id, doc })); 
  14.          }  
  15.       }().catch(err => socket.send(JSON.stringify({ id: msg.id, error: err.message })));  
  16.     }  
  17.   });  
  18. }); 

以下是如何通過 websocket 客戶端調用 streamUsers() 方法: 

  1. const client = new WebSocket('ws://localhost:8080');  
  2. // Will print each user doc 1 at a time.  
  3. client.on('message', msg => console.log(msg));  
  4. await new Promise(resolve => client.once('open', resolve));  
  5. client.send(JSON.stringify({ action: 'streamUsers', id: 1 })); 

后續

異步 generator 函數提供了一種創建更高級的,如同一些 HTTP 框架(例如 Hapi 和 Fastify)那樣,基于隱式響應的 websocket 框架的機會。而隱式響應的主要優勢就在于,你在業務邏輯中不需要關注框架是通過 websocket,HTTP 輪詢或是其他某種方式來發送結果??蚣茏杂墒?Javascript 編程更輕便并且更容易測試。

通過將所有產生的值存放在一個數組中,或者讓客戶端發起多次請求對一個指針進行迭代,streamUsers() 方法就可以很容易的在一個 HTTP 框架,或者是一個使用輪詢的 HTTP 框架中重用。沒有異步 generator 函數,所有這些都是不能實現的。 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2021-03-04 23:12:57

Node.js異步迭代器開發

2021-04-06 10:15:29

Node.jsHooks前端

2013-08-15 09:14:55

2011-12-23 13:58:57

node.js

2025-01-13 00:00:00

2020-12-08 06:28:47

Node.js異步迭代器

2021-10-22 08:29:14

JavaScript事件循環

2021-08-04 23:30:28

Node.js開發線程

2021-04-20 12:39:52

Node.js多線程多進程

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2021-05-21 09:36:42

開發技能代碼

2016-08-11 14:02:02

NodeJS前端

2020-04-15 15:48:03

Node.jsstream前端

2024-01-05 08:49:15

Node.js異步編程

2021-01-26 08:07:44

Node.js模塊 Async

2013-11-01 09:34:56

Node.js技術

2019-07-09 14:50:15

Node.js前端工具

2017-03-19 16:40:28

漏洞Node.js內存泄漏

2017-03-20 13:43:51

Node.js內存泄漏

2021-12-25 22:29:57

Node.js 微任務處理事件循環
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品videossex高潮汇编 | 视频一区二区在线观看 | 亚洲九九色 | 国产精品一区二区视频 | 国产精品久久国产精品久久 | 久久综合一区二区 | 欧美aⅴ片 | 久久久九九九九 | 天天摸天天看 | 国产一区二区三区在线 | 欧美成视频| 麻豆亚洲 | 色婷婷精品久久二区二区蜜臂av | 国产成人麻豆免费观看 | 亚洲一区二区三区免费视频 | 午夜视频在线观看一区二区 | 日韩精品久久久久 | 久久精品视频在线免费观看 | 成人性视频免费网站 | 国产综合在线视频 | 亚洲欧洲在线观看视频 | 国产中的精品av涩差av | 成人在线国产 | 欧美一区二区综合 | 请别相信他免费喜剧电影在线观看 | 欧美日韩国产一区二区三区不卡 | 围产精品久久久久久久 | 在线免费观看日本视频 | 国产精品一区二区三区99 | 免费观看黄a一级视频 | 日韩无 | 国产电影一区二区在线观看 | 国产在线97| 久久99深爱久久99精品 | 一区二区av | 亚洲精品亚洲人成人网 | 欧美成人激情 | 成人午夜免费视频 | 国产区精品 | 羞羞视频在线网站观看 | 亚洲激情一区二区 |