详解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
JavaScript判断密码强度(自写代码)
Sep 06 Javascript
Javascript数组与字典用法分析
Dec 13 Javascript
angularjs 处理多个异步请求方法汇总
Jan 06 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
Jan 26 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
Apr 17 jQuery
原生javascript实现分页效果
Apr 21 Javascript
jQuery实现百度登录框的动态切换效果
Apr 21 jQuery
详解async/await 异步应用的常用场景
May 13 Javascript
JavaScript canvas实现跟随鼠标事件
Feb 10 Javascript
element-ui封装一个Table模板组件的示例
Jan 04 Javascript
一定要知道的 25 个 Vue 技巧
Nov 02 Vue.js
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中ADODB类详解
2008/03/25 PHP
jQuery 源码分析笔记
2011/05/25 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
JavaScript创建命名空间的5种写法
2014/06/24 PHP
Laravel框架表单验证详解
2014/09/04 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
用JavaScript和注册表脚本实现右键收藏Web页选中文本
2007/01/28 Javascript
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007/04/12 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
详解Vue 中 extend 、component 、mixins 、extends 的区别
2017/12/20 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
2020/11/13 Javascript
[38:23]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第一场
2014/05/24 DOTA
pyv8学习python和javascript变量进行交互
2013/12/04 Python
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
python队列queue模块详解
2018/04/27 Python
numpy中矩阵合并的实例
2018/06/15 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
网络方面基础面试题
2012/11/16 面试题
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
同意转租证明
2015/06/24 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js