您现在的位置是:亿华云 > 数据库
使用异步编程保证 Koa 的洋葱模型
亿华云2025-10-03 20:23:04【数据库】5人已围观
简介哈喽大家好!我是小三。今天更的是前端文章,小三前端比较菜,有什么地方写得不对大家可以留言或者联系我探讨修改哦。koa框架的业务流程是一个完全的异步编程模型,通过ctx上下文对象来贯穿http的上下游。
哈喽大家好!我是使用小三。今天更的异步洋葱是前端文章,小三前端比较菜,编程保证有什么地方写得不对大家可以留言或者联系我探讨修改哦。模型
koa框架的使用业务流程是一个完全的异步编程模型,通过ctx上下文对象来贯穿http的异步洋葱上下游。对我们来说最重要的编程保证就是理解洋葱模型。
先来看一个经典的模型洋葱图认识一下
我们先来看一下这个代码
const Koa = require(koa) const app = new Koa() //第一个中间件 app.use((ctx, next) => { console.log("第一个中间件", 1); next() console.log("第一个中间件", 2); }) //第二个中间件 app.use((ctx, next) => { console.log("第二个中间件", 3); next() console.log("第二个中间件", 4); }) //第三个中间件 app.use((ctx, next) => { console.log("第三个中间件", 5); console.log("第三个中间件", 6); }) app.listen(3000, () => { console.log("Koa已经开启在http://loclhost:3000"); })我们运行这个代码在浏览器打开并返回控制台看一下打印
第一个中间件 1
第二个中间件 3
第三个中间件 5
第三个中间件 6
第二个中间件 4
第一个中间件 2
大家可以看这段代码,其执行效果为135642,使用也就是异步洋葱说这就好比第一个中间件把第二个包裹了起来,第三个中间件又把第二个中间件包起来了,编程保证调用next时就回去执行第二个中间件,模型结束后继续执行第一个。使用
所以他的异步洋葱顺序应该是这样的
看到上图相信大家已经非常的了解了吧。
然后下面我们会用到async await这个语法糖,编程保证我在这里简单介绍一下async函数
它是generator函数的语法糖,可以通过 yield(中文翻译动词为提供,高防服务器暂时叫他提供) 关键字,就是把函数的执行流挂起,为改变执行流程提供了可能,从而为异步编程提供解决方案。
async函数,就是将generator函数的*换成async,将yield替换成await
简单来说async/await,就是异步编程回调函数写法的替代方法,暂且就说这么多,下一篇文章我再详细介绍async await函数,
再多说一句 async 函数执行时,如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值。
我们再反观这个洋葱模型
然后我再在第三个中间件加了个axios请求,因为他是异步的操作,所以我得再在前面加个async,然后再在请求的前面加个await,这样我们就可以得到get请求的这个结果,如果不加,他返回的云服务器提供商是一个Promise对象
这里是加了async await函数的,但是.....
const Koa = require(koa) const app = new Koa() //第一个中间件 app.use((ctx, next) => { console.log("第一个中间件", 1); next() console.log("第一个中间件", 2); }) //第二个中间件 app.use((ctx, next) => { console.log("第二个中间件", 3); next() console.log("第二个中间件", 4); }) //第三个中间件 app.use(async(ctx, next) => { console.log("第三个中间件", 5); const axios = require("axios") const res = await axios.get(http://www.baidu.com) console.log(res); console.log(发送了axios请求); console.log("第三个中间件", 6); }) app.listen(3000, () => { console.log("Koa已经开启在http://localhost:3000"); })我们自行打印这个结果,可以看到
中间省略....
可以看到,我们虽然取回了这个res结果,但是它的打印顺序变了,也就是它遇到await后就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值。
但是这不符合我们想要的结果,我们想要的是它按照本来的顺序执行,
然后我们为了保证洋葱模型,我们应该如下改动,将前面的代码也添加async await用来控制情况在我们预期之内。
const Koa = require(koa) const app = new Koa() //第一个中间件 app.use(async(ctx, next) => { console.log("第一个中间件", 1); await next() console.log("第一个中间件", 2); }) //第二个中间件 app.use(async(ctx, next) => { console.log("第二个中间件", 3); await next() console.log("第二个中间件", 4); }) //第三个中间件 app.use(async(ctx, next) => { console.log("第三个中间件", 5); const axios = require("axios") const res = await axios.get(http://www.baidu.com) console.log(发送了axios请求); console.log("第三个中间件", 6); }) app.listen(3000, () => { console.log("Koa已经开启在http://loclhost:3000"); })运行代码我们可以看到
中间省略...
所以我们在写中间件函数的时候,一般都将中间件变成async await函数,这样就不会因为异步编程导致洋葱模型不可控以至于不合理
以上是我自己的云南idc服务商理解,如果有更多的比如我说不清的,可以留言告诉我,我会好好去学习,大家一起把问题说出来互相学习,希望大家不要吝啬,求求各位大佬了
很赞哦!(483)
上一篇: 数据中心投资建设为持续何蓬勃发展
下一篇: 克服布线混乱:数据中心布线优秀实践
相关文章
- 数据中心基础设施管理(DCIM)五大趋势
- (4) 使用何种形式的域名后缀对网页搜索影响不大,但域名后缀也需要考虑方便用户记忆
- a、变更前的公司证件扫描件(代码证或者营业执照)及联系人身份证复印件、变更后的公司证件扫描件(代码证或者营业执照)及新的联系人身份证复印件;身份证复印件需本人签名,公司证件复印件需加盖公章。
- 审核通过的域名将显示在域名竞拍页面,并进入正式拍卖期,买家可以在拍卖周期内出价,加价幅度与拍卖保证金说明,点此查看。
- 打造智算中心新标杆,普洛斯数据中心荣获“2023年数据中心科技成果奖”一等奖
- 为什么现在中文域名觉得好?使用中文域名有什么好处?
- 当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
- 3、商标域名一经注册,就可以作为域名裁决过程中的主要信息之一。这可以大大增加公司被抢注的相关域名胜诉的机会。
- 将中央办公室重新架构为数据中心
- 解析之后一般在十分钟内生效,如果没有生效可以联系域名服务商进行沟通。