ES7中的async和await

ES7中的async和await

在上一章中,使用Promise將本來的回調方式轉換爲鏈式操做,這就將一個個異步執行的操做串在一條同步線上了。下一次的操做必須等待當前操做的結束。node

使用Promise的最後,遇到了一個問題,就是若是要對已經得到數據數組進行遍歷,並在遍歷中繼續對每一條數據作異步請求操做,這就構成了一個樹狀查詢。mysql

蠢辦法

對於上述問題,咱們徹底能夠用上一章中的垃圾代碼來構建一個for循環的嵌套then!
這裏寫圖片描述
但上一章已經說過,千萬不要寫出這種垃圾代碼,因此若是你的node或者瀏覽器並不支持ES6,7標準的話,徹底能夠採用傳統多層嵌套回調地獄來實現樹狀查詢,但帶來的問題,樹大了,嵌套會看起來十分噁心。sql

使用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)
    }
})()

數據庫封裝函數:queryasync

"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);
            });
        });
    });
}
相關文章
相關標籤/搜索