详解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 相关文章推荐
用函数式编程技术编写优美的 JavaScript
Nov 25 Javascript
js关于精确计算和数值格式化以及直接引js文件
Jan 28 Javascript
js动态添加的DIV中的onclick事件简单实例
Jul 25 Javascript
javascript表单控件实例讲解
Sep 13 Javascript
js截取字符串功能的实现方法
Sep 27 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
Dec 18 Javascript
微信小程序使用swiper组件实现类3D轮播图
Aug 29 Javascript
Vue文件配置全局变量的实例
Sep 06 Javascript
通过javascript实现段落的收缩与展开
Jun 26 Javascript
vue 使用axios 数据请求第三方插件的使用教程详解
Jul 05 Javascript
layui 解决form表单点击无反应的问题
Oct 25 Javascript
关于在LayUI中使用AJAX提交巨坑记录
Oct 25 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
在线短消息收发的程序,不用数据库
2006/10/09 PHP
PHP stripos()函数及注意事项的分析
2013/06/08 PHP
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
详解AngularJS 模态对话框
2016/04/07 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
利用jquery实现瀑布流3种案例
2016/09/18 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
Vue 进入/离开动画效果
2017/12/26 Javascript
axios发送post请求springMVC接收不到参数的解决方法
2018/03/05 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
Python读取图片属性信息的实现方法
2016/09/11 Python
python散点图实例之随机漫步
2018/08/27 Python
解决python3 pika之连接断开的问题
2018/12/18 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
详解Html5页面实现下载文件(apk、txt等)的三种方式
2018/10/22 HTML / CSS
彪马美国官网:PUMA美国
2017/03/09 全球购物
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
英语教师自荐信
2014/05/26 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技