NNU_從零開始瞭解一個WebGIS(Js)
阿新 • • 發佈:2021-08-16
1.同步與非同步
在 Es5 期間,由於非同步呼叫完成的先後順序無法確定,會導致非同步“回撥地獄”的問題。
Es6 新增 promise,Es7 新增 async/await。即為解決回撥問題。
1.1 promise async await 是用來幹什麼的?
簡單的說,promise 就是限制非同步執行的函式的執行順序,即:讓多個非同步函式可以在主執行緒中按順序從上往下執行。
async-await是promise和generator的語法糖。只是為了讓我們書寫程式碼時更加流暢,當然也增強了程式碼的可讀性。簡單來說:async-await 是建立在 promise機制之上的,並不能取代其地位。let one = () => 1
function two(){ return new Promise((resolve,reject) =>{ //new一個promise物件,物件裡面的引數是一個 function,裡面有兩個變數,一個 resolve (成功時執行),reject(拒絕時執行) setTimeout(() => { //這裡用一個延時器來模擬請求反應的時間滯後 resolve(2) }, 3000); }) } let three = (a,b) => a+b; async function run(){ //async告訴run要順序一個個執行console.log(one()); console.log(await two()); //await是傳送請求時讓two執行成功後才能繼續進行,如果請求失敗那麼下面的three也不會執行 console.log(three(1,2)); //也因此,await必須出現在async函式的內部,無法單獨使用
} //await 後面可以跟任何的JS 表示式。雖然說 await 可以等很多型別的東西, 但是它最主要的意圖是用來等待 Promise 物件的狀態被 resolved。
//如果 await 的是 promise 物件會造成非同步函式(此處為async function run())停止執行並且等待 promise 的解決,如果等的是正常的表示式則立即執行。
run()
//expected output:
//1
//2
//3
//若此處沒有 async 與 await 則會輸出
//1
//3
//2