详解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 扩展对input的一些操作方法
Oct 30 Javascript
在javascript将NodeList作为Array数组处理的方法
Jul 09 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
Jun 09 Javascript
JS实现的网页背景闪电闪烁效果代码
Oct 17 Javascript
微信小程序中单位rpx和rem的使用
Dec 06 Javascript
javascript基于原型链的继承及call和apply函数用法分析
Dec 15 Javascript
手把手教你搭建ES6的开发运行环境
Jul 11 Javascript
React组件refs的使用详解
Feb 09 Javascript
vue项目首屏打开速度慢的解决方法
Mar 31 Javascript
深入理解令牌认证机制(token)
Aug 22 Javascript
JavaScript实现HSL拾色器
May 21 Javascript
JavaScript forEach中return失效问题解决方案
Jun 01 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 is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
jquery购物车实时结算特效实现思路
2013/09/23 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
全面解析Bootstrap中scrollspy(滚动监听)的使用方法
2016/06/06 Javascript
实例讲解JavaScript中instanceof运算符的用法
2016/06/08 Javascript
详解http访问解析流程原理
2017/10/18 Javascript
JS实现带动画的回到顶部效果
2017/12/28 Javascript
JS中promise化微信小程序api
2018/04/12 Javascript
JS执行控制之节流模式实例分析
2018/12/21 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
python 3.5实现检测路由器流量并写入txt的方法实例
2017/12/17 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
python爬取微博评论的实例讲解
2021/01/15 Python
CSS实现雨滴动画效果的实例代码
2019/10/08 HTML / CSS
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
美国在线家装零售商:Build.com
2016/09/02 全球购物
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
Java多态性的定义以及类型
2014/09/16 面试题
自我评价优秀范文分享
2013/11/30 职场文书
优秀实习自我鉴定
2013/12/04 职场文书
办公室副主任职责范本
2014/03/08 职场文书
诉讼代理人授权委托书
2014/04/08 职场文书
精神病医院见习报告
2014/11/03 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
导游词之广西漓江
2019/11/02 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
Nginx配置Https安全认证的实现
2021/05/26 Servers