详解koa2学习中使用 async 、await、promise解决异步的问题


Posted in Javascript onNovember 13, 2018

关键词: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',{
  title: '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",
 "scripts": {
 "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-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 函数的含义和用法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Dom加载让图片加载完再执行的脚本代码
May 15 Javascript
jquery实现的超出屏幕时把固定层变为定位层的代码
Feb 23 Javascript
jquery实现div阴影效果示例代码
Sep 16 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
Jan 31 Javascript
js操作DOM--添加、删除节点的简单实例
Jul 08 Javascript
完美解决IE不支持Data.parse()的问题
Nov 24 Javascript
js仿小米手机上下滑动效果
Feb 05 Javascript
浅谈Vue SPA 首屏加载优化实践
Dec 15 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
Apr 07 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
Aug 23 Javascript
vue实现图片上传到后台
Jun 29 Javascript
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
koa源码中promise的解读
Nov 13 #Javascript
vue-router传递参数的几种方式实例详解
Nov 13 #Javascript
vue-router的使用方法及含参数的配置方法
Nov 13 #Javascript
webpack 从指定入口文件中提取公共文件的方法
Nov 13 #Javascript
详解Vue实战指南之依赖注入(provide/inject)
Nov 13 #Javascript
node.js爬取中关村的在线电瓶车信息
Nov 13 #Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
Nov 13 #Javascript
You might like
php新浪微博登录接口用法实例
2014/12/23 PHP
PHP简单实现循环链表功能示例
2017/11/10 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
jQuery在vs2008及js文件中的无智能提示的解决方法
2010/12/30 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
2016/09/21 Javascript
浅谈jQuery框架Ajax常用选项
2017/07/08 jQuery
浅谈webpack对样式的处理
2018/01/05 Javascript
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
python的中异常处理机制
2018/08/30 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
python 实现一个图形界面的汇率计算器
2020/11/09 Python
最新pycharm安装教程
2020/11/18 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
CSS3实现淘宝留白的方法
2020/06/05 HTML / CSS
波比布朗英国官网:Bobbi Brown英国
2017/11/13 全球购物
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
端口镜像是怎么实现的
2014/03/25 面试题
建筑实习自我鉴定
2013/10/18 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
教师批评与自我批评
2014/10/15 职场文书
销售经理岗位职责
2015/01/31 职场文书
毕业酒会致辞
2015/07/29 职场文书
听课评课活动心得体会
2016/01/15 职场文书
2019新员工心得体会
2019/06/25 职场文书
导游词之神仙居景区
2019/11/15 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server
详解CocosCreator项目结构机制
2021/04/14 Javascript
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js