學(xué)習(xí)mpvue筆記——koa入門

koa是什么?
koa基于Nodejs平臺(tái)的下一代web開(kāi)發(fā)框架(上一代是express)。

  1. Express原班人馬打造,更精簡(jiǎn)。
  2. Async+await處理異步
  3. 洋蔥圈型的中間件機(jī)制。
    用法很簡(jiǎn)單:
mkdir koa-demo
npm init
npm install koa --save

文件夾中新建一個(gè)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

就可以訪問(wèn)localhost:3000了。
ctx是什么呢?封裝了request和response的上下文。
next是什么呢?下一個(gè)中間件。
app是什么呢?啟動(dòng)應(yīng)用
中間件機(jī)制:

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)

結(jié)果是:135642
下面這個(gè)圖可以解釋這個(gè)機(jī)制。

洋蔥圈
洋蔥圈

寫一個(gè)小插件
新建一個(gè)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)

就可以在命令行中顯示出地址,耗時(shí)。
koa-router也很簡(jiǎn)單
安裝

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優(yōu)雅的處理異步

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

我們都知道輸出sean 1秒之后再輸出你好。
異步編程的幾個(gè)方法:

  1. callback回調(diào)函數(shù),很古老的東西了。
function ajax(fn) {
    setTimeout(() => {
        console.log('你好')
        fn()//回調(diào)函數(shù)
    }, 1000)
    
}
var fn = function () {
    console.log('sean')
}
ajax(fn)

回調(diào)函數(shù)的優(yōu)點(diǎn)是簡(jiǎn)單、容易理解和部署,缺點(diǎn)是不利于代碼的閱讀和維護(hù),各個(gè)部分之間高度耦合(Coupling),流程會(huì)很混亂,而且每個(gè)任務(wù)只能指定一個(gè)回調(diào)函數(shù)。如果回調(diào)函數(shù)中再嵌套回調(diào)函數(shù)的話,就行成了回調(diào)地獄(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鏈?zhǔn)秸{(diào)用:會(huì)將前一個(gè)then的返回值(return)作為下一次成功的回調(diào)函數(shù)的參數(shù)。

  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()

簡(jiǎn)單明了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 弄懂js異步 講異步之前,我們必須掌握一個(gè)基礎(chǔ)知識(shí)-event-loop。 我們知道JavaScript的一大特點(diǎn)...
    DCbryant閱讀 2,882評(píng)論 0 5
  • 異步編程對(duì)JavaScript語(yǔ)言太重要。Javascript語(yǔ)言的執(zhí)行環(huán)境是“單線程”的,如果沒(méi)有異步編程,根本...
    呼呼哥閱讀 7,404評(píng)論 5 22
  • 在這篇博客中,將會(huì)講述使用Retrofit十分需要的一個(gè)功能:怎么去下載文件,下面會(huì)展示一些下載文件需要寫的代碼片...
    sheepm閱讀 10,696評(píng)論 4 15
  • 高三晚自習(xí)是3小時(shí),你日均微信使用時(shí)間多長(zhǎng)? 吃飯前看看未讀信息,臨睡前看段八卦新聞,洗手間里回復(fù)一下朋友圈,開(kāi)會(huì)...
    牙麻呂閱讀 1,026評(píng)論 1 1

友情鏈接更多精彩內(nèi)容