学习mpvue笔记——koa入门

koa是什么?
koa基于Nodejs平台的下一代web开发框架(上一代是express)。

  1. Express原班人马打造,更精简。
  2. Async+await处理异步
  3. 洋葱圈型的中间件机制。
    用法很简单:
mkdir koa-demo
npm init
npm install koa --save

文件夹中新建一个server.js

const Koa = require('koa')
const app = new Koa()

app.use(async(ctx, next) => {ctx.body = 'hello'})
app.listen(3000)//端口3000
node server.js

就可以访问localhost:3000了。
ctx是什么呢?封装了request和response的上下文。
next是什么呢?下一个中间件。
app是什么呢?启动应用
中间件机制:

const Koa = require('koa')
const app = new Koa()

app.use(async(ctx, next) => {
    ctx.body = '1'
    next()
    ctx.body += '2'
})
app.use(async(ctx, next) => {
    ctx.body += '3'
    next()
    ctx.body += '4'
})
app.use(async(ctx, next) => {
    ctx.body += '5'
    next()
    ctx.body += '6'
})

app.listen(3000)

结果是:135642
下面这个图可以解释这个机制。

洋葱圈
洋葱圈

写一个小插件
新建一个koa-logger.js

module.exports = async(cxt, next) => {
    const start = new Date().getTime();
    await next();
    const end = new Date().getTime();
    console.log(cxt.request.url, end-start, cxt.body.length)
}

在server.js里引用

const koalog = require('./koa-logger.js')
app.use(koalog)

就可以在命令行中显示出地址,耗时。
koa-router也很简单
安装

npm install koa-router --save

引入

const Router = require('koa-router')
const router = new Router()

使用

router.get('/', (ctx, next) => {
    //根目录
    })
router.get('/1', (ctx, next) => {
    //
    })
    .
    .
    .
app.use(router.routes())
   .use(router.allowedMethods())    

async和await优雅的处理异步

  function ajax() {
      setTimeout(() => {
        console.log('你好')
      }, 1000)
    }
    ajax()
    console.log('sean')

我们都知道输出sean 1秒之后再输出你好。
异步编程的几个方法:

  1. callback回调函数,很古老的东西了。
function ajax(fn) {
    setTimeout(() => {
        console.log('你好')
        fn()//回调函数
    }, 1000)
    
}
var fn = function () {
    console.log('sean')
}
ajax(fn)

回调函数的优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),流程会很混乱,而且每个任务只能指定一个回调函数。如果回调函数中再嵌套回调函数的话,就行成了回调地狱(callback hell)

  1. promise
function delay(word) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(word)
        }, 1000)
    })
}
delay('鸣人').then((word) => {
    console.log(word)
    return delay('佐助')
}).then((word) => {
    console.log(word)
    return delay('小樱')
}).then((word) => {
    console.log(word)
})
//鸣人,佐助,小樱

promise链式调用:会将前一个then的返回值(return)作为下一次成功的回调函数的参数。

  1. async+await (必须一起使用)
function delay(word) {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve(word)
                }, 1000)
            })
        }

async function start() {
    const word1 = await delay('鸣人')
    console.log(word1)
    const word2 = await delay('佐助')
    console.log(word2)
    const word3 = await delay('小樱')
    console.log(word3)
}
start()

简单明了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 弄懂js异步 讲异步之前,我们必须掌握一个基础知识-event-loop。 我们知道JavaScript的一大特点...
    DCbryant阅读 2,752评论 0 5
  • 异步编程对JavaScript语言太重要。Javascript语言的执行环境是“单线程”的,如果没有异步编程,根本...
    呼呼哥阅读 7,336评论 5 22
  • 在这篇博客中,将会讲述使用Retrofit十分需要的一个功能:怎么去下载文件,下面会展示一些下载文件需要写的代码片...
    sheepm阅读 10,593评论 4 15
  • 高三晚自习是3小时,你日均微信使用时间多长? 吃饭前看看未读信息,临睡前看段八卦新闻,洗手间里回复一下朋友圈,开会...
    牙麻吕阅读 967评论 1 1