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代码块中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值