1. 程式人生 > >js非同步的實現方式

js非同步的實現方式

說到js中的非同步我們想到最多的就是ajax的非同步了

在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程式碼塊中