在上一章中,使用Promise將本來的回調方式轉換爲鏈式操做,這就將一個個異步執行的操做串在一條同步線上了。下一次的操做必須等待當前操做的結束。node
使用Promise的最後,遇到了一個問題,就是若是要對已經得到數據數組進行遍歷,並在遍歷中繼續對每一條數據作異步請求操做,這就構成了一個樹狀查詢。mysql
對於上述問題,咱們徹底能夠用上一章中的垃圾代碼來構建一個for循環的嵌套then!
但上一章已經說過,千萬不要寫出這種垃圾代碼,因此若是你的node或者瀏覽器並不支持ES6,7標準的話,徹底能夠採用傳統多層嵌套回調地獄來實現樹狀查詢,但帶來的問題,樹大了,嵌套會看起來十分噁心。sql
在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.單位); } })()
注意:瀏覽器
在使用鏈式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); }); }); }); }