问题:调接口时,非以往的函数异步请求去调接口。而是用到了Promise中.then方法
Promise
Promise是一种用于处理异步操作的对象。它代表了一个尚未完成但预计会未来完成的操作,并提供了一种结构化的方式来处理操作的结果。它起到代理作用(proxy),充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口,而不必一层层地嵌套回调函数。.
创建
通过 new Promise(res, rej) 来创建一个Promise对象。res和rej是两个可以调用的函数,用于处理异步操作结果。
var p1 = new Promise(function(resolve,reject){
//异步操作 resolve(obj1) 或者 reject(obj2)
});
p1.then(function(rs){
// 如果p1的状态是resolved,则then中的函数
//会执行,且obj1的值会传给rs
}).catch(function(rs){
// 如果p1的状态是reject,则catch中的函数
// 会执行,且obj2的值会传给rs
}).finally(function(){
// 一定会执行的函数
})
状态
Promise有三种状态:pending(待定)、fulfilled(成功)和rejected(失败)。
待定(pending)是期约的初始状态。当异步操作完成后,Promise可以转为fulfilled或rejected,二者又被称为落定状态,一旦转换 过程不可逆,即 落定后 期约状态不再改变。
处理结果
.then() 方法 来处理Promise的成功/失败结果
.catch() 方法 处理Promise失败状态(rejected)
.finally()方法 可以在Promise无论成功或失败后,都执行的操作。
注:想要用.then传递参数,直接return返回参数即可,若没返回则为undefined
Promise.all()
接收一个Promise数组为参数,并返回一个新的Promise对象。当所有都解决时,才返回解决值;若有一个拒绝,新的Promise将被拒绝,并返回拒绝原因
.then()
p.then(函数1[,函数2])
第一个参数是resolved状态回调函数,第二个是rejected状态的回调函数
注:当promise状态为rejected时,但并未设置第二个参数,则会抛出一个错误,提示是Uncaught(in promise)
async-await的语法
async,await是es7中新增的语法,用来改进异步代码写法,是promise升级版
- async函数返回一个promise对象
- async函数内部return语句返回的值是promise对象的值
await命令
- await的外层函数必须有一个async
- 正常情况下,await命令后面是一个promise对象,返回该promise的值。如果不是promise对象就直接返回对应的值
可以使用async-await来优化回调地狱。
问题解决:
-> .then(onResolver())
参考:
promise解决回调地狱 - 简书
Promise - 掘金
https://www.cnblogs.com/zjdxr-up/p/17042819.html
JS红宝书
Promise - JavaScript | MDN