详解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 相关文章推荐
页面中js执行顺序
Nov 09 Javascript
prettify 代码高亮着色器google出品
Dec 28 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
Jan 23 Javascript
JS实现点击下载的小例子
Jul 10 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
Feb 28 Javascript
javascript数组去重的方法汇总
Apr 14 Javascript
jquery简单实现外部链接用新窗口打开的方法
May 30 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
Dec 31 Javascript
AngularJS 使用$sce控制代码安全检查
Jan 05 Javascript
js案例之鼠标跟随jquery版(实例讲解)
Jul 21 jQuery
使用javascript做在线算法编程
May 25 Javascript
d3绘制基本的柱形图的实现代码
Dec 12 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写出自己的BLOG系统 2
2010/04/12 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
php中实现记住密码下次自动登录的例子
2014/11/06 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
2015/09/22 PHP
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
PHP 图片处理
2020/09/16 PHP
Jquery时间验证和转换工具小例子
2013/07/01 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
2015/11/17 Javascript
js实现文字截断功能
2016/09/14 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
微信小程序tabBar用法实例详解
2017/12/04 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
详解Python中的各种函数的使用
2015/05/24 Python
Python中scatter函数参数及用法详解
2017/11/08 Python
Python字符串匹配之6种方法的使用详解
2019/04/08 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
基于python连接oracle导并出数据文件
2020/04/28 Python
python利用opencv实现颜色检测
2021/02/23 Python
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
中国最大的团购网站:聚划算
2016/09/21 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
奢华的意大利皮革手袋:Bene Handbags
2019/10/29 全球购物
科颜氏香港官方网店:Kiehl’s香港
2021/03/07 全球购物
消防安全责任书
2014/04/14 职场文书
酒店节能降耗方案
2014/05/08 职场文书
购房意向书
2014/08/30 职场文书
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
python识别围棋定位棋盘位置
2021/07/26 Python