详解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 相关文章推荐
用jQuery实现检测浏览器及版本的脚本代码
Jan 22 Javascript
JavaScript入门教程(6) Window窗口对象
Jan 31 Javascript
js 图片随机不定向浮动的实现代码
Jul 02 Javascript
js实现类似jquery里animate动画效果的方法
Apr 10 Javascript
jquery模拟进度条实现方法
Aug 03 Javascript
JavaScipt中栈的实现方法
Feb 17 Javascript
jquery单击事件和双击事件冲突解决方案
Mar 02 Javascript
javascript拖拽效果延伸学习
Apr 04 Javascript
Javascript点击按钮随机改变数字与其颜色
Sep 01 Javascript
vue中实现滚动加载更多的示例
Nov 08 Javascript
Vue精简版风格指南(推荐)
Jan 30 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
Sep 06 Javascript
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 编程的 5个良好习惯
2009/02/20 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
2013/07/19 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
用js实现上传图片前的预览(TX的面试题)
2007/08/14 Javascript
javascript 动态参数判空操作
2008/12/22 Javascript
基于JQUERY的两个ListBox子项互相调整的实现代码
2011/05/07 Javascript
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
全面解析Angular中$Apply()及$Digest()的区别
2016/08/04 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
Node.js中出现未捕获异常的处理方法
2020/06/29 Javascript
python保存字符串到文件的方法
2015/07/01 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
2017/07/25 Python
python 为什么说eval要慎用
2019/03/26 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
python+opencv实现车道线检测
2021/02/19 Python
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
中国一家综合的外贸B2C电子商务网站:DealeXtreme(DX)
2020/03/10 全球购物
颁奖晚会主持词
2014/03/25 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP
教你怎么用Python操作MySql数据库
2021/05/31 Python