Koa2中有关async&await的用法有哪些?

这篇文章主要介绍了理解koa2中的async&await的用法,现在分享给大家,也给大家做个参考。

Koa是一款非常著名的Node服务端框架,有1.x版本和2.x版本。前者使用了generator来进行异步操作,后者则用了最新的async/await方案

一开始使用这种写法的时候,我遇到一个问题,代码如下:

const Koa = require('koa');const app = new Koa();const doSomething = time => {  return new Promise(resolve => {    setTimeout(() => {      resolve('task done!')    }, time)  })}// 用来打印请求信息app.use((ctx, next) => {  console.log(`${ctx.method}:::${ctx.url}`)  next()})app.use(async ctx => {  const result = await doSomething(3000)  console.log(result);  ctx.body = result})app.listen(3000);

登录后复制

让我们测试一下:curl http://localhost:3000

期望结果:

(3秒后…)task done!

然而现实却是:

(立即)
Not Found

什么鬼?为什么没有按照预期执行?这就需要我们来理解下Koa中中间件是如何串联起来的了。翻一下源码,将middlewares串联起来的代码如下:

function compose (middleware) { return function (context, next) {  // 这个index用来计数,防止next被多次调用  let index = -1  // 执行入口  return dispatch(0)    function dispatch (i) {   // 如果next被多次调用,报异常   if (i 

有了以上基础,我们再来看一下之前的问题,为什么response没有等到第二个middleware执行完成就立即返回了呢?

因为第一个middleware并不是一个异步函数啊。

由于每次next方法的执行,实际上都是返回了一个Promise对象,所以如果我们在某个middleware中执行了异步操作,要想等待其完成,就要在执行这个middleware之前添加await

那我们来改写一下之前的代码

app.use(async (ctx, next) => {  console.log(`${ctx.method}:::${ctx.url}`)  await next()})app.use(async ctx => {  const result = await doSomething(3000)  console.log(result);  ctx.body = result})

登录后复制

好了,没有问题,一切如期望执行:clap:

错误处理

借助了Promise强大的功力,配合async/await语法,我们只需要把try/catch的操作写在最外层的middleware中,就可以捕获到之后所有中间件的异常!

app.use(async (ctx, next) => {  try{    await next()  }catch(err){    console.log(err)  }})app.use(async (ctx)=>{  throw new Error('something wrong!')  ctx.body = 'Hello'})

登录后复制

基于中间件链的完全控制,并且基于 Promise 的事实使得一切都变得容易操作起来。不再是到处的 if (err) return next(err) 而只有 promise

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在D3.js中如何实现动态进度条

在D3.js中如何实现动态进度条

在D3.js中如何实现动态进度条

以上就是Koa2中有关async&await的用法有哪些?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3187226.html

(0)
上一篇 2025年3月31日 23:06:47
下一篇 2025年3月31日 23:06:53

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • script标签中的async和defer用法

    script标签用于加载脚本与执行脚本,在前端开发中可以说是非常重要的标签了。直接使用script脚本的话,html会按照顺序来加载并执行脚本,在脚本加载&执行的过程中,会阻塞后续的DOM渲染。 现在大家习惯于在页面中引用各种的第三…

    2025年4月1日 编程技术
    200
  • 在Node.js中使用Async和Await函数

    这篇文章主要介绍了node.js中的async和await函数的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在本文中,你将学习如何使用Node.js中的async函数(async/await)来简化callback或Prom…

    编程技术 2025年3月31日
    200
  • 通过webpack如何打包koa2 框架app,该怎么做?

    本文给大家介绍的是使用webpack为koa2框架打包的步骤及最终的部署,非常实用,有需要的小伙伴可以参考下 以前在用koa写server的时候,发布简直是噩梦。需要将src里面的全部文件都覆盖掉,config配置文件也要覆盖,稍有不慎就会…

    编程技术 2025年3月31日
    100
  • koa2怎样做出注册登录功能

    这次给大家带来koa2怎样做出注册登录功能,koa2做出注册登录功能的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 前段时间和公司一个由技术转产品的同事探讨他的职业道路,对我说了一句深以为然的话: “不要把自己禁锢在某一个领域,技…

    2025年3月31日
    200
  • 使用vue+vuex+koa2如何搭建开发环境

    本篇文章主要介绍了详解vue + vuex + koa2开发环境搭建及示例开发,现在分享给大家,也给大家做个参考。 写在前面 这篇文章的主要目的是学会使用koa框架搭建web服务,从而提供一些后端接口,供前端调用。 搭建这个环境的目的是: …

    编程技术 2025年3月31日
    100
  • 使用Koa2实现文件上传下载

    这次给大家带来Koa2做出文件上传下载功能,Koa2做出文件上传下载功能的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 上传下载在 web 应用中还是比较常见的,无论是图片还是其他文件等。在 Koa 中,有很多中间件可以帮助我们快…

    编程技术 2025年3月31日
    200
  • React对服务端进行渲染改造

    这次给大家带来React对服务端进行渲染改造,React对服务端进行渲染改造的注意事项有哪些,下面就是实战案例,一起来看一下。 因为对网页SEO的需要,要把之前的React项目改造为服务端渲染,经过一番调查和研究,查阅了大量互联网资料。成功…

    2025年3月31日
    100
  • node使用Koa2搭建web项目

    本文主要介绍了node使用koa2搭建web项目的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 随着Node.js的日益火热,各种框架开始层出不穷的涌现出来,Node.js也开始逐渐的…

    2025年3月31日
    100
  • 使用async、enterproxy如何控制并发数量

    并发相信对大家来说都不陌生,这篇文章主要给大家介绍了关于使用async、enterproxy控制并发数量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面一起学习学习吧。 聊聊并发与并行…

    2025年3月31日
    100
  • vue3+async-validator如何实现表单验证

    搭建vue3的项目 创建项目前 这里我们首先要说明的是,我们使用的版本情况 Nodejs:v17.5.0 pnpm:7.0.0 Vue:3.2.25 首先我们 Vite 创建一个 vue3 的项目demo,名字就叫 FormValidate…

    2025年3月30日
    100

发表回复

登录后才能评论