关键词:async 、await、promise
这三个东西 可以优雅的解决异步问题。在学习koa2的时候遇到了获取数据后再进行模板渲染的异步问题。在查找各种资料后成功的解决了该问题,现在写个笔记记录一下。
先说一下async、await,第一次见到这两个词是在学习vue的时候。因为前端在写代码的时候经常的会遇到向后台请求数据这样的场景,等待数据返回才可以进行下一步的操作。这就不得不处理异步这种情况。
async、await基本的语法就是:
let asyncFn = async()=> {
let data = null;
data = await getData(url);//getData()返回的数据是 {name:\'my name is data!\'}
console.log(data.name);//打印出的是my name is data!
}
getData();为一个封装了请求数据的方法;
如果不处理异步的情况:
let notAsyncFn =()=> {
let data = null;
data = getData(url);//getData()返回的数据是 {name:\'my name is data!\'}
console.log(data.name);//打印出的是undefined; 因为data此时还是null;
}
await 命令后面的 函数返回的是一个Promise 对象,运行结果可能是 rejected,所以最好把 await 命令放在 try...catch 代码块中。
getData函数的代码:
var getData = function (url){
console.log(\"get start\");
console.log(url);
return new Promise(function (resolve, reject) {
//下面的request()方法 是nodeJS的request模块;
request(url, function (error, response, body) {
if (!error && response.statusCode == 200) {
resolve(response.body);
}else{
//throw new Error(response.statusText)
reject(\'===error===\');
}
});
})
console.log(\"get end\");
}
promise的相关介绍可以移步 大白话讲解Promise(一)
还有await 命令只能用在 async 函数之中,如果用在普通函数,就会报错。
koa2中具体的代码:
/**
* koa2路由代码
*/
//引入router模块
var router = require(\'koa-router\')();
//引入server模块 封装的请求函数
var server = require(\'../server\');
//url 是假的额 写的百度的网址
const url = \'www.baidu.com\';
router.get(\'/\',async function (ctx,next){
var data = await server.get(url);
console.log(\'======data=====\');
console.log(data);
await ctx.render(\'myPage\',{
: \'123wangcong\',
data: data
})
});
module.exports = router;
/**
* server模块的代码
*/
node的request模块
var request = require(\'request\');
module.exports = {
get : function (url){
console.log(\"get start\");
console.log(url);
return new Promise(function (resolve, reject) {
request(url, function (error, response, body) {
if (!error && response.statusCode == 200) {
resolve(response.body);
}else{
//throw new Error(response.statusText)
reject(\'error===\');
}
});
})
console.log(\"get end\");
}
}
把package也贴出来
{
\"name\": \"koa2-demo\",
\"version\": \"0.1.0\",
\" s\": {
\"start\": \"NODE_ENV=development ./node_modules/.bin/nodemon bin/run\",
\"test1\": \"NODE_ENV=test ./node_modules/.bin/nodemon bin/run\",
\"koa\": \"./node_modules/.bin/runkoa bin/www\",
\"pm2\": \"pm2 start bin/run \",
\"test\": \"./node_modules/.bin/mocha -u bdd\"
},
\"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- \": \"^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 函数的含义和用法
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
继续阅读与本文标签相同的文章
上一篇 :
LTE:随时随地预先配置Surface Pro
下一篇 :
易语言设置组合框内容自动排序的方法
-
ASP.NET Core on K8S深入学习(8)数据管理
2026-05-19栏目: 教程
-
AI翻译新思路,OBTranslate打破非洲城乡居民之间的沟通差距
2026-05-19栏目: 教程
-
物联网平台实用技巧:调用API获取设备状态
2026-05-19栏目: 教程
-
路漫漫其修远兮,吾将上下而求索
2026-05-19栏目: 教程
-
Kerberos使用OpenLDAP作为backend
2026-05-19栏目: 教程
