解决回调地狱的方法
1.promise(resolve,reject)—将函数的状态暂停/凝固,函数调用的时候不会马上触发
Promise实现原理
我们使用promise的时候会将函数的状态暂停/凝固 ,promise函数调用的时候不会马上触发new Promise1.使用new 关键字实现promise2.promise有两种状态resolve,reject3.promise函数不会马上触发,要通过一个then函数去触发4.then触发的是resolve的状态,catch触发reject的状态resolve --->成功 --thenreject --->失败 --catch
function go(){return new Promise((resolve,reject)=>{resolve(1);reject(2);})}go().then(res=>{console.log(res)}).catch(err=>{console.log(err)})
例子
/* 回调函数是一个异步处理过程 */var p=new Promise((resolve,reject)=>{resolve("success");rejecet("失败");})p.then(res=>{console.log(res) //success})console.log("4")//输出结果:4success
2.封装promise
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>function http(){return new Promise((resolve,reject)=>[$.ajax({url:"https://music.aityp.com/top/playlist?cat=华语",type:"get",success:res=>{resolve(res)},error:err=>{reject(err)}})})}http().then(res=>{console.log(res)})</script>
例子—网易云音乐
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script><script src="lib/http-promise.js"></script>
lib/http-promist.js
var baseUrl="https://music.aityp.com/";function http(url){return new Promise((resolve,reject)=>{$.ajax({url:baseUrl+url,type:"get",success:res=>{resolve(res)},error:err=>{reject(err)}})})}
/*使用promise之后将http请求由纵向的变为横向的了*/http("top/playlist?cat=华语").then(res=>{let id=res.playlists[0].id;return id}).then(res=>{http(`playlist/detail?id=${res}`).then(res=>{let id=res.playlist.trackIds[0].id;return id}).then(res=>{http(`song/url?id=${res}`).then(res=>{console.log(res)})})})
ajax就是一个promise
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
var url="https://music.aityp.com/top/playlist?tag=华语";var ajax=$.ajax({url,type:"get"})console.log(ajax)ajax.then(res=>{console.log(res)})
