美文网首页前端开发
koa2学习中使用 async 、await、promise解决

koa2学习中使用 async 、await、promise解决

作者: RiverSouthMan | 来源:发表于2017-04-21 13:52 被阅读1701次
    关键词: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 函数的含义和用法

    相关文章

      网友评论

        本文标题:koa2学习中使用 async 、await、promise解决

        本文链接:https://www.haomeiwen.com/subject/ygldzttx.html