关键词: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\',{
   : \'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\",
 \" s\": {
 \"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- \": \"^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 函数的含义和用法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

收藏 打印