详解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 20 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
Mar 18 Javascript
js判断选择的时间是否大于今天的代码
Aug 20 Javascript
Jquery绑定事件(bind和live的区别介绍)
Aug 23 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
Feb 22 Javascript
jquery基础知识第一讲之认识jquery
Mar 17 Javascript
jquery分隔Url的param方法(推荐)
May 25 Javascript
基于Bootstrap的网页设计实例
Mar 01 Javascript
详解使用webpack打包编写一个vue-toast插件
Nov 08 Javascript
深入解析vue 源码目录及构建过程分析
Apr 24 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
Jun 04 Javascript
vue实现图片按比例缩放问题操作
Aug 11 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
Protoss兵种介绍
2020/03/14 星际争霸
PHP新手上路(九)
2006/10/09 PHP
PHP入门速成教程
2007/03/19 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
PHP时间相关常用函数用法示例
2020/06/03 PHP
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
2010/11/05 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
2011/02/23 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
2014/01/11 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
javascript实现无缝上下滚动特效
2015/12/16 Javascript
javascript设置页面背景色及背景图片的方法
2015/12/29 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
基于Node.js搭建hexo博客过程详解
2019/06/25 Javascript
webpack打包优化的几个方法总结
2020/02/10 Javascript
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
2017/11/08 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
使用python模拟高斯分布例子
2019/12/09 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
python中round函数如何使用
2020/06/19 Python
Python 没有main函数的原因
2020/07/10 Python
CSS3样式linear-gradient的使用实例
2017/01/16 HTML / CSS
uniapp+Html5端实现PC端适配
2020/07/15 HTML / CSS
拉斯维加斯酒店、演出、旅游、俱乐部及更多:Vegas.com
2019/02/28 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
Delphi笔试题
2016/11/14 面试题
上学迟到的检讨书
2014/01/11 职场文书
新学期开学寄语
2014/01/18 职场文书
网络优化专员求职信
2014/05/04 职场文书
鸟的天堂导游词
2015/01/31 职场文书
中标通知书
2015/04/17 职场文书
MYSQL 运算符总结
2021/11/11 MySQL