• ES7中的async和await


    ES7中的async和await

    在上一章中,使用Promise将原本的回调方式转换为链式操作,这就将一个个异步执行的操作串在一条同步线上了。下一次的操作必须等待当前操作的结束。

    使用Promise的最后,遇到了一个问题,就是如果要对已经获得数据数组进行遍历,并在遍历中继续对每一条数据做异步请求操作,这就构成了一个树状查询。

    蠢办法

    对于上述问题,我们完全可以用上一章中的垃圾代码来构建一个for循环的嵌套then!
    这里写图片描述
    但上一章已经说过,千万不要写出这种垃圾代码,所以如果你的node或者浏览器并不支持ES6,7标准的话,完全可以采用传统多层嵌套回调地狱来实现树状查询,但带来的问题,树大了,嵌套会看起来十分恶心。

    使用async和await

    在ES7标准中,最为人津津乐道的无非是新增的“async”,“await”语法糖了。

    来看下面使用代码这两个语法解决上述问题:

    (async function(){
        const sql1 = "select * from student_base_info limit 10";
        let res1 = await query(sql1);
        for(let r of res1){
            console.log(`学号:${r.学号}`);
    	    let res2 = await query(`select * from student_school_info where 学号='${r.学号}'`)
            for(let r2 of res2)
                console.log(r2.单位);
        }
    })()
    

    注意:

    • await的作用就是等待Promise的resolve的出现,这个过程是阻塞的。
    • await必须放在async function之中,目前最外层的那个看着多余的async,官方正在解决中。
    • 使用了await就不必使用then来接受异步操作的返回值,而是直接赋值给变量即可,所赋的值就是resolve给出的值。

    关于错误与异常

    在使用链式then操作时,是在最后加上catch()来获得reject给出的错误或异常(reject是负责给出异步活动中的错误),如果使用的是await,则需要用到try catch块来抛出reject的异常。

    (async function(){
        try{
            const sql1 = "select * from student_base_info limit 10 sss";
            let res1 = await query(sql1);
            for(let r of res1){
                console.log(`学号:${r.学号}`);
                let res2 = await query(`select * from student_school_info where 学号='${r.学号}'`)
                for(let r2 of res2)
                    console.log(r2.单位);
            }
        }catch(err){
            console.log("错误")
            console.log(err)
        }
    })()
    

    数据库封装函数:query

    "use strict";
    const mysql = require("mysql");
    const conn = {
        host:"localhost",
        user:"root",
        password:"",
        database:"cslginfo"
    };
    
    function query(sql){
        let pool = mysql.createPool(conn);
        return new Promise(function(resolve,reject){
            pool.getConnection(function(err,conn){
                if(err) reject(err);
    
                conn.query(sql,function(err,res,fields){
                    if(err) reject(err);
                    else resolve(res);
                });
            });
        });
    }
    
  • 相关阅读:
    索引在什么情况下遵循最左前缀的规则?
    MySQL索引种类
    简述触发器、函数、视图、存储过程?
    6.Class 与 Style 绑定
    2.Javascript 函数(主要)
    Java的string类
    PHP+mysql注入的基本过程
    Android自动化测试Emmagee
    EclEmma的介绍、安装与使用
    软件测试方法
  • 原文地址:https://www.cnblogs.com/devilyouwei/p/8945226.html
Copyright © 2020-2023  润新知