koa2 使用 async 、await、promise解决异步的问题
koa代码编写上避免了多层的嵌套异步函数调用 async await来解决异步
- async await 需要依赖于promise
三主角: __函数前面 async, 内部才能await,要想await能有用,就用promise包裹他__
1._函数前面 async
app.use(async (ctx)=>{ if(ctx.url==='/') { let data=await asyncReadFile(); ctx.body=data; // 设置响应头 ctx.set('content-type','text/html;charset=utf-8'); //content-type: text/html;charset=utf-8 } else { ctx.body='ok'; } });
2.内部才能await
let data=await asyncReadFile();
3. 返回一个Promise 对象(包含两个参数)
function asyncReadFile() { return new Promise(function(resolve,reject) { fs.readFile('./index.html',(err,data)=>{ // 1:失败,err 2:成功需要data if(err) { reject(err); return; } // 成功 resolve(data); }); }); }
网整例子:
app.js
const fs = require('fs'); const koa = require('koa'); let app=new koa(); function asyncReadFile() { return new Promise(function(resolve,reject) { fs.readFile('./index.html',(err,data)=>{ // 1:失败,err 2:成功需要data if(err) { reject(err); return; } // 成功 resolve(data); }); }); } app.use(async (ctx)=>{ if(ctx.url==='/') { let data=await asyncReadFile(); ctx.body=data; // 设置响应头 ctx.set('content-type','text/html;charset=utf-8'); //content-type: text/html;charset=utf-8 } else { ctx.body='ok'; } }); app.listen(1000);
html
<!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta charset="utf-8"> <title></title> </head> <body> <h1>hell world</h1> </body> </html>
效果:
越努力越幸运