详解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调试技巧解决样式问题的步骤分享
Mar 15 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
Jul 20 Javascript
不到30行JS代码实现Excel表格的方法
Nov 15 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
Sep 17 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
Apr 13 Javascript
JS实现页面打印(整体、局部)
Aug 18 Javascript
JS实现div模块的截图并下载功能
Oct 17 Javascript
JavaScript生成指定范围随机数和随机序列的方法
May 05 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
May 10 Javascript
通过vue-cli3构建一个SSR应用程序的方法
Sep 13 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
Jun 01 Javascript
pnpm对npm及yarn降维打击详解
Aug 05 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制作的意见反馈表源码
2007/03/11 PHP
php xml文件操作代码(一)
2009/03/20 PHP
php实现简单的语法高亮函数实例分析
2015/04/27 PHP
Zend Framework教程之Zend_Config_Ini用法分析
2016/03/23 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
2016/12/15 PHP
php基于dom实现读取图书xml格式数据的方法
2017/02/03 PHP
解决Laravel5.5下的toArray问题
2019/10/15 PHP
PJ Blog修改-禁止复制的代码和方法
2006/10/25 Javascript
jQuery each()小议
2010/03/18 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
2015/10/31 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
Bootstrap3 内联单选和多选框
2016/12/29 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
微信小程序 动态绑定数据及动态事件处理
2017/03/14 Javascript
js模拟支付宝密码输入框
2017/04/11 Javascript
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
Python执行时间的计算方法小结
2017/03/17 Python
使用Python制作微信跳一跳辅助
2018/01/31 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
2018/05/08 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
Python 求数组局部最大值的实例
2019/11/26 Python
python之生成多层json结构的实现
2020/02/27 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
司机辞职报告范文
2014/01/20 职场文书
令人印象深刻的自荐信
2014/05/25 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
交通安全横幅标语
2014/10/07 职场文书
道歉信怎么写
2015/05/12 职场文书
2015年小学体育教师工作总结
2015/10/23 职场文书