溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node.js中如何使用異步Generator函數

發布時間:2021-07-20 16:36:42 來源:億速云 閱讀:145 作者:Leah 欄目:web開發

本篇文章給大家分享的是有關Node.js中如何使用異步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 方式讀取一個指針的實現:

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

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

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

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

const WebSocket = require('ws');  const server = new WebSocket.Server({    port: 8080  });  server.on('connection', function(socket) {    socket.on('message', function(msg) {      // Handle message   });  });

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

const WebSocket = require('ws');  const server = new WebSocket.Server({    port: 8080  });  server.on('connection', function(socket) {   socket.on('message', function(msg) {      msg = JSON.parse(msg);      if (msg.action === 'streamUsers') {        void async function() {          // Send 1 message per user, as opposed to loading all users and then          // sending them all in 1 message.          for await (const doc of streamUsers()) {            socket.send(JSON.stringify({ id: msg.id, doc }));          }        }().catch(err => socket.send(JSON.stringify({ id: msg.id, error: err.message })));      }    });  });

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

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

以上就是Node.js中如何使用異步Generator函數,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女