详解koa2学习中使用 async 、await、promise解决异步的问题
关键词:async、await、promise
这三个东西可以优雅的解决异步问题。在学习koa2的时候遇到了获取数据后再进行模板渲染的异步问题。在查找各种资料后成功的解决了该问题,现在写个笔记记录一下。
先说一下async、await,第一次见到这两个词是在学习vue的时候。因为前端在写代码的时候经常的会遇到向后台请求数据这样的场景,等待数据返回才可以进行下一步的操作。这就不得不处理异步这种情况。
async、await基本的语法就是:
letasyncFn=async()=>{
letdata=null;
data=awaitgetData(url);//getData()返回的数据是{name:'mynameisdata!'}
console.log(data.name);//打印出的是mynameisdata!
}
getData();为一个封装了请求数据的方法;
如果不处理异步的情况:
letnotAsyncFn=()=>{
letdata=null;
data=getData(url);//getData()返回的数据是{name:'mynameisdata!'}
console.log(data.name);//打印出的是undefined;因为data此时还是null;
}
await命令后面的函数返回的是一个Promise对象,运行结果可能是rejected,所以最好把await命令放在try...catch代码块中。
getData函数的代码:
vargetData=function(url){
console.log("getstart");
console.log(url);
returnnewPromise(function(resolve,reject){
//下面的request()方法是nodeJS的request模块;
request(url,function(error,response,body){
if(!error&&response.statusCode==200){
resolve(response.body);
}else{
//thrownewError(response.statusText)
reject('===error===');
}
});
})
console.log("getend");
}
promise的相关介绍可以移步大白话讲解Promise(一)
还有await命令只能用在async函数之中,如果用在普通函数,就会报错。
koa2中具体的代码:
/**
*koa2路由代码
*/
//引入router模块
varrouter=require('koa-router')();
//引入server模块封装的请求函数
varserver=require('../server');
//url是假的额写的百度的网址
consturl='www.baidu.com';
router.get('/',asyncfunction(ctx,next){
vardata=awaitserver.get(url);
console.log('======data=====');
console.log(data);
awaitctx.render('myPage',{
title:'123wangcong',
data:data
})
});
module.exports=router;
/**
*server模块的代码
*/
node的request模块
varrequest=require('request');
module.exports={
get:function(url){
console.log("getstart");
console.log(url);
returnnewPromise(function(resolve,reject){
request(url,function(error,response,body){
if(!error&&response.statusCode==200){
resolve(response.body);
}else{
//thrownewError(response.statusText)
reject('error===');
}
});
})
console.log("getend");
}
}
把package也贴出来
{
"name":"koa2-demo",
"version":"0.1.0",
"scripts":{
"start":"NODE_ENV=development./node_modules/.bin/nodemonbin/run",
"test1":"NODE_ENV=test./node_modules/.bin/nodemonbin/run",
"koa":"./node_modules/.bin/runkoabin/www",
"pm2":"pm2startbin/run",
"test":"./node_modules/.bin/mocha-ubdd"
},
"dependencies":{
"co":"^4.6.0",
"debug":"^2.2.0",
"ejs":"^2.5.6",
"jade":"~1.11.0",
"koa":"^2.0.0",
"koa-bodyparser":"^2.0.1",
"koa-convert":"^1.2.0",
"koa-json":"^1.1.1",
"koa-logger":"^1.3.0",
"koa-onerror":"^1.2.1",
"koa-request":"^1.0.0",
"koa-router":"^7.0.0",
"koa-static":"^1.5.2",
"koa-views":"^5.0.1",
"runkoa":"^1.5.2"
},
"devDependencies":{
"mocha":"^2.4.5",
"nodemon":"^1.9.1",
"should":"^8.3.0",
"supertest":"^1.2.0"
}
}
哦对了async函数里可以多次使用await语句,我以为只能用一次await!!!并不是的!!!!
async更详细的介绍可以看这里阮一峰async函数的含义和用法
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。