1.回调地狱
使用ajax请求id ,再根据id请求用户名,再根据用户名请求email
定义:在回调函数中嵌套回调
通过promis解决回调地狱的问题
2.promise的使用
Promise语法:
const p = new Promise((resolve, reject) => {})
- Promise接收一个函数作为参数,在函数中有两个参数
- resolve是一个函数
- reject是一个函数
Promise有两个属性
- state 状态
- result 结果
1.Promise状态
第一种准备状态 pending(准备,待解决)
第二种状态 fulfilled(已成功)
第三种状态:rejected(已拒绝,失败)
2.Promise状态的改变
通过调用Promise里面的函数resolve()和reject()就可以改变Promise状态
Promise状态改变是一次性的,只能调用一个函数
const p = new Promise((resolve, reject) => { //调用resolve函数 Promise状态变为fulfilled //调用reject函数,Promise状态变为rejected resolve(); rejected(); }) console.log(p);
3.Promise的结果
const p = new Promise((resolve, reject) => { //调用resolve函数 通过给函数中传递参数 可以改变Promise的结果 resolve('成功') }) console.log(p); //result 成功
3.Promise的方法
1.then方法
const p = new Promise((resolve, reject) => { //调用resolve函数 通过给函数中传递参数 可以改变Promise的结果 resolve('成功') // reject('失败') }) console.log(p); // then方法中有两个参数,一个是函数,另一个也是函数 p.then(()=>{ // 当Promise状态为fulfilled调用第一个函数 console.log('成功时候被调用'); },()=>{ //当Promise状态为rejected时调用第二个函数 console.log('reject时候被调用'); })
then方法中有两个参数,一个是函数,另一个也是函数
1.1获取Promise的数据
给then方法函数里面一个形参来使用Promise对象的结果
const p = new Promise((resolve, reject) => { //调用resolve函数 通过给函数中传递参数 可以改变Promise的结果 resolve('123') // reject('失败') }) console.log(p); // then方法中有两个参数,一个是函数,另一个也是函数 p.then((value)=>{ // 当Promise状态为fulfilled调用第一个函数 console.log('成功时候被调用',value); },(reson)=>{ //当Promise状态为rejected时调用第二个函数 console.log('reject时候被调用',reson); })
then方法会返回一个新的Promise实例,而且Promise的状态是pending
1.2链式操作
new Promise((resolve,reject)=>{}).then().then()
Promise里面状态不改变,不执行函数
const p = new Promise((reolve, reject) => { reolve() }) const t = p.then((value) => { console.log('成功'); return '123' // 如果这里代码出错就会改变Promise 状态为rejected },(reson)=>{ console.log('失败'); }) t.then((value)=>{ console.log('成功1',value); },(reson)=>{ console.log('失败1',reson); })
使用return可以在then方法中将返回的Promise实例改为fulfilled
2.catch方法
catch里面参数函数在什么时候被执行?
- 在调用reject
- 输入了一个错误的代码的时候会调用catch
const p = new Promise((resolve, reject) => { reject() // console.log(a); }) p.catch((reson) => { console.log('出错了', reson); })
4.解决回调地狱的问题
使用Promise
new Promise((reslove, reject) => { $.ajax({ type: 'GET', url: 'data1.json', success: function (res) { reslove(res) }, error: function (res) { } }) }).then((data) => { const { id } = data return new Promise((reslove, reject) => { $.ajax({ type: 'GET', url: 'data2.json', data: { id }, success: function (res) { reslove(res) }, error: function (res) { } }) }).then((data) => { const { username } = data return new Promise((reslove, reject) => { $.ajax({ type: 'GET', url: 'data3.json', data: { username }, success: function (res) { reslove(res) }, error: function (res) { } }) }) }) })
代码优化
因为代码里面有许多重复的,所以我们把Ajax封装起来 看起来更简洁
// 封装一个函数用来请求数据 function getData (url, data = {}) { return new Promise((reslove, reject) => { $.ajax({ type: 'GET', url: url, data: data, success: function (res) { reslove(res) }, }) }) } getData('data1.json').then((data) => { const { id } = data return getData('data2.json', { id }).then((data) => { const { username } = data return getData('data3.json', { username }).then((data)=>{ console.log(data); }) }) })