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

使用異步編程保證 Koa 的洋蔥模型

開發(fā) 前端
koa框架的業(yè)務(wù)流程是一個完全的異步編程模型,通過ctx上下文對象來貫穿http的上下游。對我們來說最重要的就是理解洋蔥模型。

哈嘍大家好!我是小三。今天更的是前端文章,小三前端比較菜,有什么地方寫得不對大家可以留言或者聯(lián)系我探討修改哦。

koa框架的業(yè)務(wù)流程是一個完全的異步編程模型,通過ctx上下文對象來貫穿http的上下游。對我們來說最重要的就是理解洋蔥模型。

先來看一個經(jīng)典的洋蔥圖認識一下

我們先來看一下這個代碼

  1. const Koa = require('koa'
  2. const app = new Koa() 
  3. //第一個中間件 
  4. app.use((ctx, next) => { 
  5.     console.log("第一個中間件", 1); 
  6.     next() 
  7.     console.log("第一個中間件", 2); 
  8. }) 
  9. //第二個中間件 
  10. app.use((ctx, next) => { 
  11.     console.log("第二個中間件", 3); 
  12.     next() 
  13.     console.log("第二個中間件", 4); 
  14. }) 
  15. //第三個中間件 
  16. app.use((ctx, next) => { 
  17.     console.log("第三個中間件", 5); 
  18.     console.log("第三個中間件", 6); 
  19. }) 
  20. app.listen(3000, () => { 
  21.     console.log("Koa已經(jīng)開啟在http://loclhost:3000"); 
  22. }) 

我們運行這個代碼在瀏覽器打開并返回控制臺看一下打印

第一個中間件 1

第二個中間件 3

第三個中間件 5

第三個中間件 6

第二個中間件 4

第一個中間件 2

大家可以看這段代碼,其執(zhí)行效果為135642,也就是說這就好比第一個中間件把第二個包裹了起來,第三個中間件又把第二個中間件包起來了,調(diào)用next時就回去執(zhí)行第二個中間件,結(jié)束后繼續(xù)執(zhí)行第一個。

所以他的順序應(yīng)該是這樣的

看到上圖相信大家已經(jīng)非常的了解了吧。

然后下面我們會用到async await這個語法糖,我在這里簡單介紹一下async函數(shù)

它是generator函數(shù)的語法糖,可以通過 yield(中文翻譯動詞為提供,暫時叫他提供) 關(guān)鍵字,就是把函數(shù)的執(zhí)行流掛起,為改變執(zhí)行流程提供了可能,從而為異步編程提供解決方案。

async函數(shù),就是將generator函數(shù)的*換成async,將yield替換成await

簡單來說async/await,就是異步編程回調(diào)函數(shù)寫法的替代方法,暫且就說這么多,下一篇文章我再詳細介紹async await函數(shù),

再多說一句 async 函數(shù)執(zhí)行時,如果遇到 await 就會先暫停執(zhí)行 ,等到觸發(fā)的異步操作完成后,恢復(fù) async 函數(shù)的執(zhí)行并返回解析值。

我們再反觀這個洋蔥模型

然后我再在第三個中間件加了個axios請求,因為他是異步的操作,所以我得再在前面加個async,然后再在請求的前面加個await,這樣我們就可以得到get請求的這個結(jié)果,如果不加,他返回的是一個Promise對象

這里是加了async await函數(shù)的,但是.....

  1. const Koa = require('koa'
  2. const app = new Koa() 
  3.     //第一個中間件 
  4. app.use((ctx, next) => { 
  5.         console.log("第一個中間件", 1); 
  6.         next() 
  7.         console.log("第一個中間件", 2); 
  8.     }) 
  9.     //第二個中間件 
  10. app.use((ctx, next) => { 
  11.         console.log("第二個中間件", 3); 
  12.         next() 
  13.         console.log("第二個中間件", 4); 
  14.     }) 
  15.     //第三個中間件 
  16. app.use(async(ctx, next) => { 
  17.     console.log("第三個中間件", 5); 
  18.     const axios = require("axios"
  19.     const res = await axios.get('http://www.baidu.com'
  20.     console.log(res); 
  21.     console.log('發(fā)送了axios請求'); 
  22.     console.log("第三個中間件", 6); 
  23. }) 
  24. app.listen(3000, () => { 
  25.     console.log("Koa已經(jīng)開啟在http://localhost:3000"); 
  26. }) 

我們自行打印這個結(jié)果,可以看到

中間省略....

可以看到,我們雖然取回了這個res結(jié)果,但是它的打印順序變了,也就是它遇到await后就會先暫停執(zhí)行 ,等到觸發(fā)的異步操作完成后,恢復(fù) async 函數(shù)的執(zhí)行并返回解析值。

但是這不符合我們想要的結(jié)果,我們想要的是它按照本來的順序執(zhí)行,

然后我們?yōu)榱吮WC洋蔥模型,我們應(yīng)該如下改動,將前面的代碼也添加async await用來控制情況在我們預(yù)期之內(nèi)。

  1. const Koa = require('koa'
  2. const app = new Koa() 
  3. //第一個中間件 
  4. app.use(async(ctx, next) => { 
  5.     console.log("第一個中間件", 1); 
  6.     await next() 
  7.     console.log("第一個中間件", 2); 
  8. }) 
  9. //第二個中間件 
  10. app.use(async(ctx, next) => { 
  11.     console.log("第二個中間件", 3); 
  12.     await next() 
  13.     console.log("第二個中間件", 4); 
  14. }) 
  15. //第三個中間件 
  16. app.use(async(ctx, next) => { 
  17.     console.log("第三個中間件", 5); 
  18.     const axios = require("axios"
  19.     const res = await axios.get('http://www.baidu.com'
  20.     console.log('發(fā)送了axios請求'); 
  21.     console.log("第三個中間件", 6); 
  22. }) 
  23. app.listen(3000, () => { 
  24.     console.log("Koa已經(jīng)開啟在http://loclhost:3000"); 
  25. }) 

運行代碼我們可以看到

中間省略...

所以我們在寫中間件函數(shù)的時候,一般都將中間件變成async await函數(shù),這樣就不會因為異步編程導(dǎo)致洋蔥模型不可控以至于不合理

 

以上是我自己的理解,如果有更多的比如我說不清的,可以留言告訴我,我會好好去學(xué)習(xí),大家一起把問題說出來互相學(xué)習(xí),希望大家不要吝嗇,求求各位大佬了

 

責(zé)任編輯:武曉燕 來源: 零零后程序員小三
相關(guān)推薦

2022-10-25 08:01:17

洋蔥模型Koa

2023-07-30 15:14:19

Koa蔥圈模型

2013-04-01 15:38:54

異步編程異步編程模型

2021-06-29 09:34:00

洋蔥模型中間件

2016-11-22 16:57:30

koanode.jsjavascript

2023-01-12 11:23:11

Promise異步編程

2011-02-22 08:49:16

.NET同步異步

2011-02-22 09:09:21

.NETAsync CTP異步

2013-04-01 15:25:41

異步編程異步EMP

2023-10-30 23:25:48

FuturesGo語言

2015-09-16 15:11:58

C#異步編程

2021-03-22 08:45:30

異步編程Java

2020-11-02 08:51:57

中間件和洋蔥模型

2023-06-13 13:39:00

多線程異步編程

2011-07-27 14:10:43

javascript

2020-10-15 13:29:57

javascript

2024-04-01 09:45:50

TAP模式.NET異步編程

2021-04-26 05:33:54

Python異步編程

2024-02-07 11:44:20

NestJSRxJS異步編程

2017-05-05 08:44:24

PythonAsyncio異步編程
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 97视频人人澡人人爽 | 亚洲v日韩v综合v精品v | 亚洲综合色视频在线观看 | 91视频免费黄 | 午夜影院在线免费观看视频 | 国产午夜精品一区二区三区四区 | 亚洲区在线 | 色呦呦在线 | 久久国产精品精品国产色婷婷 | 免费一区二区三区 | 嫩草视频入口 | 久久久久久亚洲精品 | 亚洲精品久久国产高清情趣图文 | 欧美日韩国产三级 | 成人国产在线视频 | 日韩中文字幕 | 四虎永久免费影院 | 国产91丝袜在线播放 | 高清av电影 | 欧美黄a | 91黄色片免费看 | 热99在线| 一级视频黄色 | 二区高清 | 精品国产一二三区 | 国产激情在线 | 6080亚洲精品一区二区 | 欧美日韩1区| 综合激情av | 国产一区二区三区四区三区四 | 一级在线毛片 | 久久毛片| 国产精品免费观看视频 | 黑人巨大精品欧美一区二区免费 | 成人精品国产免费网站 | 成人超碰在线 | 亚洲欧美视频 | 成人在线观看免费爱爱 | 久久精品国产一区二区电影 | 97精品一区二区 | 亚洲精品高清视频 |