总结|总结 回调地狱的解决方法 以及可迭代对象
在有关回调地狱的学习中 出现了多种解决方法 下面是根据学过的知识,整理出来的一份总结
1 首先是promise解决回调地狱 的方法
(1)解决一个ajax的时候
function jq_pro(url,data){
return $.ajax({
url,
data,
dataType:"json",
})
}jq_pro("a.json").then(res=>{
delDate(res);
},res=>{})
(2)解决多个ajax的时候(互有联系)
// 1.原生的写法
function js_pro(url) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open("get", url, true);
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var data = https://www.it610.com/article/xhr.responseText;
resolve(data);
} else {
reject("404");
}
}
}
})
}js_pro("a.json").then(res=>{return js_pro("b.json")
},res=>{}).then(res=>{
return js_pro("c.json")
}).then(res=>{
delDate(res);
})function delDate(data){
console.log(data);
}//jq写法function jq_pro(url,data){
return $.ajax({
url,
data,
dataType:"json",
})
}jq_pro("a.json").then(res=>{return jq_pro("b.json",{name:res})
},res=>{}).then(res=>{
return jq_pro("c.json")
}).then(res=>{
delDate(res);
})
(3)解决多个ajax(互相之间没有关系)
race请求多个promise 只不过是只要有一个响应成功了就会触发.then
function jq_pro(url,data){
return $.ajax({
url,
data,
dataType:"json"
})
}Promise.all([
jq_pro("a.json"),
jq_pro("b.json"),
jq_pro("c.json")
]).then(res=>{
console.log(res);
let [a,b,c]=res;
delData1(a);
delData1(b);
delData1(c);
})function delData1(res){
console.log(res)
}
2 async解决回调函数
(1) async的语法:
async和await关键字搭配使用 async函数永远返回一个promise对象,如果函数里有返回值的话,在这个async执行之后的.then方法里能拿到
await是等待的意思后面一般跟一个promise对象,await会让他后面的promise对象自动执行,执行完成后才会继续执行下一句代码
(2) 特点:
用同步的写法执行异步的操作
(3) async处理回调地狱写法
async function fun1(){
let data1=await js_pro("a.json");
let data2=await js_pro("b.json");
let data3=await js_pro("c.json");
return data3;
}
console.log(fun1())
fun1().then(res=>{
console.log(res);
}).catch(res=>{
console.log(res)
})
(4)有关await的用法
var pro=new Promise(function(resolve,reject){
setTimeout(function(){
console.log("await的计时器")
resolve();
},3000)
})
async function fun2(){
await pro;
//等待计时器的执行,
console.log("aaaa")//计时器执行完后,也就是3000毫秒之后执行console.log
}
console.log(fun2())
// fun2().then(res=>{
//console.log(res);
// })function fun3(){
setTimeout(function(){
console.log("同步函数计时器")
},3000)
console.log("同步代码aaa")
}
fun3();
【总结|总结 回调地狱的解决方法 以及可迭代对象】3 generator(生成器函数) 解决回调地狱
(1) 特点:
generator除了用return 还可以用yield 返回多次, 只要碰到yield 函数执行就会暂停,暂停了之后如果想继续执行 用next方法继续执行
generator调用next方法返回的是一个json,里面的value是yield返回的值 done是这个函数有没有执行完毕
(2) 与普通函数,async函数的区别:
generator函数跟普通函数的区别 generator函数可以暂停
generator函数和async函数的区别 async函数在等待了之后会自动的继续往后执行,generator函数暂停了之后需要手动调用next方法才能继续往后执行
(3) 写法:
function * ger(){
yield js_pro("a.json");
yield js_pro("b.json");
yield js_pro("c.json");
}
var obj=ger();
obj.next().value.then(res=>{
return obj.next().value
}).then(res=>{
console.log(res);
return obj.next().value
}).then(res=>{
console.log(res);
})
4 可迭代对象
(1)可迭代对象有:数组 nodeList 字符串 set map
(2)for of循环只能循环可迭代对象
(3)generator生成器生成的是一个迭代器
(4) 可迭代对象的Symbol.iterator属性可以把可迭代对象变成一个迭代器,就可以去执行next()方法
var arr=["a","b"," c"]
var obj=arr[Symbol.iterator]();
console.log(obj.next());
//done:false;
value:"a";
console.log(obj.next());
//done:false;
value:"b";
console.log(obj.next());
//done:false;
value:"c";
console.log(obj.next());
//done:true;
value:undefined;
推荐阅读
- 7.9号工作总结~司硕
- 最有效的时间管理工具(赢效率手册和总结笔记)
- 数据库总结语句
- 周总结|周总结 感悟
- 周总结43
- 参加【21天写作挑战赛】,第七期第14天,挑战感受小总结
- 第二阶段day1总结
- 新梦想91期特训班两天一晚学习感想及总结(学生(魏森林))
- 周总结(10.5-10.11)
- 2019.11.14号总结