您的位置:首页 > Web前端 > JavaScript

js异步的实现方式

2017-06-08 18:04 302 查看
说到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代码块中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: