详解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 toggle()设置CSS样式
Nov 05 Javascript
js获取判断上传文件后缀名的示例代码
Feb 19 Javascript
JQuery打造省市下拉框联动效果
May 18 Javascript
js实现单击图片放大图片的方法
Feb 17 Javascript
javascript实现表格增删改操作实例详解
May 15 Javascript
实例讲解js验证表单项是否为空的方法
Jan 09 Javascript
JS图片放大效果简单实现代码
Sep 08 Javascript
javascript中setAttribute兼容性用法分析
Dec 12 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
Jul 23 Javascript
详解JavaScript的数据类型以及数据类型的转换
Apr 20 Javascript
layui--select使用以及下拉框实现键盘选择的例子
Sep 24 Javascript
小程序实现图片移动缩放效果
May 26 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操作redis缓存方法分享
2015/06/03 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
javascript继承机制实例详解
2014/11/20 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
JavaScript 学习笔记之操作符(续)
2015/01/14 Javascript
JS实现超简单的鼠标拖动效果
2015/11/02 Javascript
Javascript中的迭代、归并方法详解
2016/06/14 Javascript
vuex实现简易计数器
2016/10/27 Javascript
jQuery插件autocomplete使用详解
2017/02/04 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
jquery实现选项卡切换代码实例
2019/05/14 jQuery
[42:23]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第二场 12.10
2020/12/13 DOTA
Python爬虫信息输入及页面的切换方法
2018/05/11 Python
可能是最全面的 Python 字符串拼接总结【收藏】
2018/07/09 Python
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
python中正则表达式与模式匹配
2019/05/07 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
html5 外链式实现加减乘除的代码
2019/09/04 HTML / CSS
是否有自动比较结构的方法
2015/06/03 面试题
经典c++面试题四
2015/05/14 面试题
4s店机修工岗位职责
2013/12/20 职场文书
中式餐厅创业计划书范文
2014/01/23 职场文书
幸福家庭标语
2014/06/27 职场文书
搞笑老公保证书
2015/02/26 职场文书
2016先进集体事迹材料范文
2016/02/25 职场文书
POST提交数据常见的四种方式
2022/01/18 HTML / CSS