公司做网站推广优化大师怎么强力卸载
回调地狱:指的是代码大量使用了回调函数,在一个函数里面调用另一个函数一直嵌套函数进行调用。页面就会显得很混乱。
举个例子
我们需要从接口获取数组然后进行操作
getMsg(function(){
//操作
})
如果在我们拿的返回值作为参数传到第二个接口中。才能获取数据怎么办?没关系加个嵌套就可以了:
getMsg(function(){
getMsg1(function(){
//获取数据
})
})
在如果我还要在此基础上去访问第三个接口呢?或者是根据条件决定是否访问第三个接口呢?。那样页面一层层的ajax的嵌套,就是回调地狱的现象了。
es6的promise可以解决这个问题
我们把一个个的访问接口的内容写在成promise方法
function getMsg(){
var p=new Promise(function(resolve, reject){
$.ajax({
url:"https://api.vvwx.net/studentclient/homepage/allnavigationicon",
data:JSON.stringify({schid: "19",subtype: "11"}),
type:'POST',
dataType:'JSON',
success:function(res){
console.log("111")
resolve(res)
},
})})
return p;
}
function getMsg1(){
var p = new Promise(function(resolve, reject){
$.ajax({
url:"https://api.vvwx.net/studentclient/schoolzone/allzone",
data:JSON.stringify({schid: "19"}),
type:'POST',
dataType:'JSON',
success:function(res){
console.log("000")
resolve(res);
},
})
});
return p;
}
getMsg().then(function(){//执行完第一个之后执行第二个
return getMsg1()
}).then(() => {//第二个执行完打印成功
console.log('成功')
});
如果还有第三个接口函数继续在then后面写。then代表的是前面的执行完了,然后的操作
getMsg().then(function(){
return getMsg1()
}).then(function(){
return getMsg2()
}).then(() => {
console.log('成功')
});
其实我们也可以使用await的方法来写。他和promise方法的区别稍后总结。
如果使用await来写上面的代码就变成.代码精简了很多。看起来条理也很清晰
async function a(){
await getAjax();
await getAjax2();
console.log('成功')
}a();
await必须在async的函数里面调用。表示执行完这个await的promise方法再往下执行。await修饰的是个promise对象。
await
连续使用问题
代码一:
async function foo() {await sleep(3);await sleep(3);return 'done';}
运行完需要6秒。
代码二:
async function bar() {const s1 = sleep(3);const s2 = sleep(3);await s1;await s2;return 'done';
代码二运行完却只要3秒,因为sleep是在同一时间运行的。
所以两者之间的优劣显而易见啦。
上面的代码就改成:
async function a(){
var f1=getAjax();
var f2= getAjax2();await f1;
await f2;console.log('成功')
}a();
下面我又写了一个有个简单的用延时来模拟接口数据的await的小例子
asyncAwait();
async function asyncAwait() {
console.log("start")
const user = await this.A();
const friends = await this.B();
console.log('end')
}
function A(){
return new Promise(resove => {
setTimeout(() => {
console.log('A')
resove()
}, 200)
})
}
function B(){
return new Promise(resove => {
setTimeout(() => {
console.log('B')
resove()
}, 100)
})
},
我们看到上面明明是B里面100ms以后就执行。执行的速度比 A 200ms是快的。但是最后却是执行完了A在执行的B。实际上是按照代码的顺序从上往下执行的。