详解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默认校验规则整理
Mar 24 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
Jun 16 Javascript
使用JavaScript刷新网页的方法
Jun 04 Javascript
javascript函数的四种调用模式
Jan 08 Javascript
js实现年月日表单三级联动
Apr 17 Javascript
vue router demo详解
Oct 13 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
May 10 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
Aug 07 Javascript
Preload基础使用方法详解
Feb 03 Javascript
JS实现简易留言板增删功能
Feb 08 Javascript
ES6函数和数组用法实例分析
May 23 Javascript
JavaScript实现通讯录功能
Dec 27 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 heredoc和phpwind的模板技术使用方法小结
2008/03/28 PHP
php中的strpos使用示例
2014/02/27 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
利用bootstrapValidator验证UEditor
2016/09/14 Javascript
VUE JS 使用组件实现双向绑定的示例代码
2017/01/10 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
2017/02/09 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
2018/01/18 jQuery
JavaScript中set与get方法用法示例
2018/08/15 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
js实现无限瀑布流实例方法
2019/09/16 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
Python基础语法(Python基础知识点)
2016/02/28 Python
深入理解Python中range和xrange的区别
2017/11/26 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
Python pandas自定义函数的使用方法示例
2019/11/20 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
科研先进个人典型材料
2014/01/31 职场文书
师范生自我鉴定
2014/03/20 职场文书
环保建议书100字
2014/05/14 职场文书
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
大学生党课心得体会
2016/01/07 职场文书
授权协议书范本(3篇)
2019/10/15 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript
详解MySql中InnoDB存储引擎中的各种锁
2022/02/12 MySQL