關於await使用中錯誤的處理node
// 普通函數 function fuc() { return 27 } console.log(fuc()); // 27 //async函數 async function firstAsync() { return 27 } console.log(firstAsync()) // Promise {<resolved>: 27} // 返回了一個promise對象,將27返回到resolve裏面 // 至關於 --> async function firstAsync() { return Promise.resolve(27) } firstAsync().then(val => { console.log(val) // 27 }) console.log(firstAsync() instanceof Promise) // true 能夠對async返回的對象進行判斷
下面函數如何能夠按照順序執行?promise
async function firstAsync() { // 聲明異步操做,執行完畢以後才能執行下面的函數 let promise = new Promise((resolve,reject) => { setTimeout(() => { resolve('now it is done') }, 1000) }) // 執行異步操做 promise.then(val => { console.log(val) }) console.log(2) return 3 } firstAsync().then(val => { console.log(val) }) //2 //3 //now it is done
使用await
異步
async function firstAsync() { // 聲明異步操做,執行完畢以後才能執行下面的函數 let promise = new Promise((resolve,reject) => { setTimeout(() => { resolve('now it is done') }, 1000) }) // 執行異步操做 let result = await promise console.log(result) console.log(2) return 3 } firstAsync().then(val => { console.log(val) }) //now it is done //2 //3
await promise
是一個表達式,後面必需要跟promise
對象,若是不是會自動處理成promise
對象async
console.log(await promise) //now it is done ---有返回值 console.log(await 40) //40 console.log(await promise.resolve(40)) //40
不然會報錯函數
若是不對await
進行錯誤處理,則會阻斷程序執行。學習
await
使用中,若是promise
對象返回resolve
,則返回什麼值就是什麼值,包括undefined
。spa
可是若是返回reject
,則返回值返回undefined
,從catch
函數中能夠接收到。code
catch
裏面處理,不須要對await
返回值進行判斷try-catch
是處理同步報錯的問題,若是await
函數以後有報錯,則沒法判斷報錯來源// 定義一個函數,返回promise對象 function firstAsync() { return new Promise((resolve,reject) => { const a = 0; if(a){ resolve(1) }else{ reject(2) } }) } async function hello () { // 判斷是否有報錯 try{ const res = await firstAsync() console.log(res) }catch(err){ console.log("err") console.log(err) } }
await
函數進行異步錯誤處理// 定義一個函數,返回promise對象 function firstAsync() { return new Promise((resolve,reject) => { const a = 0; if(a){ resolve(1) }else{ reject(2) } }) } async function hello () { // 判斷是否有報錯 const res = await firstAsync().catch(err =>{ console.log("err") console.log(err) }) if(res){ //TODO } } hello();
await
調用只須要對返回值進行判斷便可,不須要單獨進行catch
處理const awaitWrap = () => { let promise = new Promise((resolve,reject) => { const a = 0; if(a){ resolve(1) }else{ reject(2) } }) return promise .then(data => [data, null]) .catch(err => { // 通用錯誤處理寫這裏 TODO return [null,err] }) } async function he() { const [data, err] = await awaitWrap(); if(data){ //若是是reslove走這裏 console.log(data) }else{ //若是是reject走這裏 console.log("error") console.log(err) //特殊錯誤處理寫這裏 TODO } } he();