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