js非同步的實現方式
阿新 • • 發佈:2019-02-10
說到js中的非同步我們想到最多的就是ajax的非同步了
async 只要宣告在函式的頭部記好了
在promise沒有正式提出來之前我們一般使用settime來模擬js的非同步
舉個例子 node的非同步就是根據callback函式的回撥來完成的,不過你回撥多了就會造成回撥的地獄,頁面中都是回撥估計你也會瘋的,
這個時候promise出來了
promise就是鏈式呼叫最後也會提供一個錯誤處理的判斷
注意裡面的兩個函式return new Promise(async(resolve,reject) => { let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress; const ipArr = ip.split(":"); ip = ipArr[ipArr.length-1]; if(process.env.NODE_ENV == "development"){ ip = '116.226.184.83'; } try{ let result; result = await this.fetch('http://apis.map.qq.com/ws/location/v1/ip',{ ip, key:this.tencentkey, }) if(result.status !== 0 ){ result = await this.fetch('http://apis.map.qq.com/ws/location/v1/ip',{ ip, key:this.tencentkey2, }) } if(result.status == 0){ const cityInfo = { lat : result.result.location.lat, lng : result.result.location.lng, city : result.result.ad_info.city, } cityInfo.city = cityInfo.city.replace(/市$/, ''); resolve(cityInfo); }else{ console.log("定位失敗",result); reject("失敗"); } }catch(err){ reject(err); } })
resolve(cityInfo)
reject(err);
這是promise提供給我們的兩個方法 reject 是在我們的判斷被拒絕的時候呼叫的 ,, resolve相反而且會進入下一層的非同步中也就是then中
async/ await
是ES7提出的新方案 目前除了ie的edge 似乎都不支援但是我們可以通過babel 的 "stage-3"來進行轉化,這個就自行下載吧
具體用法
async checkAdimn(req,res,next){ const admin_id = req.session.admin_id; if(!admin_id || !Number(admin_id)){ res.send({ status:0, type:'ERROR_SESSION', message:'親,您還沒有登入', }) return }else{ const admin = await AdminModel.findOne({id: admin_id}); if(!admin){ res.send({ status:0, type:'HAS_NO_ACCESS', message:'許可權不足,請聯絡管理員提升許可權', }) return } } next() }
async 只要宣告在函式的頭部記好了
async 的大概意思就是可以使得你宣告的函式同步的執行 await是進行先後順序的控制 每次執行一個await,程式都會暫停等待await返回值,然後再執行之後的await。
await後面呼叫的函式需要返回一個promise,另外這個函式是一個普通的函式就行了
await 只能用在saync函式之中,用在普通函式中就會報錯
await命令後面的promise物件,執行結果可能是rejected,所以最好把await命令放在try...catch程式碼塊中