# npm install -g koa-generator # koa2 -e project # cd project # npm install # npm run dev
async用來定義一個返回 AsyncFunction 對象的異步函數,它會經過一個隱式的 Promise 返回其結果。若是你在代碼中使用了異步函數,它以同步的寫法去執行異步的代碼;使用場景:連續的異步請求下,下一步的異步請求依賴於前一步的異步請求結果。
node
promise是經過回調函數不斷調用.then方法去執行下面的方法連續操做;async以同步的寫法去執行異步的代碼,拿到執行結果,async實際上是promise的語法糖。寫法上更優雅。可讀性更高。解藕性高
npm
何時用await?promise
當外層函數有async的時候,內部沒有await是能夠的;函數內部有await,外層必定要有async。不然會報錯。await後面必定是Promise對象,若是不是會自動包裝成Promise對象,其實async是Promise的語法糖,內部幫咱們作了處理
瀏覽器
index.js
cookie
# 在node中全局對象不是window,是global # ctx:ctx對象掛載了全部信息,能夠拿到上下文中的 request 與 response 對象; router.get('/testAsync', async (ctx, next) => { global.console.log('start', new Date().getTime()); let a = await new Promise((resolve, reject) => { setTimeout(() => { global.console.log('async a', new Date().getTime()); resolve('a') }, 1000) }) let b = await 'b'; ctx.body = { a, b } })
app.use(「本身中間件引入的名字」)去引用app
koa-pv.js
框架
# mkdir middleware # touch middleware/koa-pv.js function pv(ctx) { global.console.log(`pv:${ctx.path}`) } module.exports = function () { return async function (ctx, next) { global.console.log(`pv start`) pv(ctx) await next() //中間件運行完畢後調用下一個,next至關於觸發器 global.console.log(`pv end`) } }
app.js
dom
const Koa = require('koa') const app = new Koa() const pv = require('./middleware/koa-pc') app.use(pv());
刷新頁面在咱們控制檯裏能夠看到咱們的剛纔中間間中打印出來的內容
koa
在app.js中引入,並使用異步
login.js
# touch routes/login.js const router = require('koa-router')() router.prefix('/login') //前綴對應頁面。模塊化去區分 router.get('/',async (ctx,next)=>{ await ctx.render('login', { title: 'Hello login!' }) } router.get('/bar',async (ctx,next)=>{ ctx.body={ code: 0, data:{ count:1 } } }) module.exports = router
app.js
# 在app.js中引入login.js const Koa = require('koa') const app = new Koa() const login = require('./routes/login') app.use(login.routes(), login.allowedMethods())
須要用到時看API便可。
const router = require('koa-router')() router.prefix('/login') router.get('/', async (ctx, next) => { ctx.cookies.set('pvid', Math.random()) await ctx.render('login', { title: 'Hello login!' }) }) router.get('/bar', async (ctx, next) => { ctx.body = ctx.cookies.get('pvid'); }) module.exports = router