在这一章的学习中 重点需要知道:
1 同步和异步
2回调地狱
3promise对象
1 同步异步
(1)同步任务:指没有被引擎挂起,在主线程上排队等待执行的任务。只有前一个任务执行完毕,才能执行下一个任务。
(2)异步任务:指被引擎放在一边,不进入主线程、而进入任务队列的任务。只有引擎认为某个异步任务可以执行了,该任务才会进入主线程执行。排在异步任务后面的代码不用等待异步任务结束,会马上执行。
例:
var start=new Date();
setTimeout(function cb(){
console.log("时间间隔:",new Date()-start+'ms');
},500);
while(new Date()-start<1000){}
2 回调地狱
含义:多个回调函数嵌套的写法叫做回调地狱
例: 请求到a的数据了之后再去请求b的数据,请求到b的数据之后,再去请求c的数据
回调地狱的写法是合法的,只不过是写法比较繁琐
ajax的回调地狱:
例:
$.ajax({
url:"a.json", 请求到a的数据
dataType:"json",
success(data){ 成功的回调函数
$.ajax({ 请求到b的数据
url:"b.json",
dataType:"json",
success(data){ 成功的回调函数
$.ajax({ 请求到c的数据
url:"c.json",
dataType:"json",
success(data){
console.log(data)
}
})
}
})
}
})
3 promise对象
1)含义:是一个对象
2)作用:Promise对象主要把回调函数嵌套的写法变成链式写法
1、主要用于异步计算
2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
3、可以在对象之间传递和操作promise,帮助我们处理队列
3)用法: Promise对象里放的是异步操作的代码,异步操作的代码的状态会从等待状态变为成功状态或者是失败状态,当他的状态发生改变的时候就会触发.then方法,。then方法里有两个函数,第一个是成功的函数,第二个是失败的函数;
需要注意的是:
jq的$.ajax返回的本身就是一个promise对象,可以直接调用then方法
假设$.ajax返回的不是promise的话我们需要自己new Promise方法 ,才能调用then方法
例:
jq的$.ajax返回的本身就是一个promise对象,可以直接调用then方法
$.ajax({url:"a.json",dataType:"json"}).then(res=>{
},res=>{
})
假设$.ajax返回的不是promise的话我们需要自己new Promise方法 ,才能调用then方法
function jqajax(resolve,reject){
$.ajax({
url:"a.json",
dataType:"json",
success(data){
resolve(data)
},
error(data){
reject(data)
}
})
}
var pro1=new Promise(jqajax)
pro1.then(res=>{
console.log(res)
},res=>{
console.log(res)
})
用promise解决回调地狱的问题
1)回调地狱数据之间有关联的情况
eg:
function jq_pro(url,data){
return $.ajax({
url,
data,
dataType:"json",
})
}
jq_pro("a.json").then(res=>{
return jq_pro("b.json")
}).then(res=>{
console.log(res);
return jq_pro("c.json")
}).then(res=>{
console.log(res);
})
2)回调地狱数据之间没有关系的情况:
当页面中有多个ajax请求的时候,而且他们之间没有关系,就可以用promise.all发送多个promise异步操作
eg:
function jq_pro(url,data){
return $.ajax({
url,
data,
dataType:"json"
})
}
Promise.all([ 用于多个互相之间没有关系的ajax请求
jq_pro("a.json"),
jq_pro("b.json"),
jq_pro("c.json")
]).then(res=>{
console.log(res); 得到的是一个数组 数组里请求的ajax的数据
let [a,b,c]=res; 用数组解构提取数据
delData1(a);
delData1(b);
delData1(c);
})
function delData1(res){
console.log(res)
}
3)异步操作计时器
function set_pro(arg,time){
return new Promise(function(resolve,reject){
setTimeout(()=>{
var a=arg
resolve(a)
},time)
})
}
set_pro(10,1000).then(res=>{
return set_pro(20+res,2000)
}).then(res=>{
return set_pro(res,3000)
}).then(res=>{
console.log(res);
})
Promise.all([
set_pro(10,3000),
set_pro(20,1000),
set_pro(30,1000)
]).then(res=>{
console.log(res);
})
4 promise有三个状态:
1、pending[待定]初始状态
2、fulfilled[实现]操作成功
3、rejected[被否决]操作失败
当promise状态发生改变,就会触发then()里的响应函数处理后续
5 方法:.then();
1、接收两个函数作为参数,分别代表fulfilled(成功)和rejected(失败)
2、.then()返回一个新的Promise实例,所以它可以链式调用
3、当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行
4、状态响应函数可以返回新的promise,或其他值,不返回值也可以我们可以认为它返回了一个null;
5、如果返回新的promise,那么下一级.then()会在新的promise状态改变之后执行
6、如果返回其他任何值,则会立即执行下一级.then()