Promise
1:使用promise原因
了解回调地狱【什么是回调地狱】
1:回调地狱是异步获取结果后,为下一个异步函数提供参数,层层回调嵌入回调
2:导致回调层次很深,代码维护特别困难
3:在没有ES6时,是将每一个request【网络请求】封装成一个函数将结果进行返回
promise解决问题
1:promise解决异步方法,本质上是一个构造函数,可以用它来实例化一个对象
2:对象身上有resolve,reject,all原型上有then,catch方法
3:promise对象有三种状态:(1)pending(初始化状态|进行中)(2)resolved|fulfilled(成功状态)(3)rejected(失败)
promise三种状态
(1)pending它的意思是 “待定的,将发生的”,相当于是一个初始状态。创建Promise对象时,且没有调用resolve或者是reject方法,相当于是初始状态。这个初始状态会随着你调用resolve,或者是reject函数而切换到另一种状态。
(2)resolved表示解决了,就是说这个承诺实现了。 要实现从pending到resolved的转变,需要在 创建Promise对象时,在函数体中调用了resolve方法 。
(3)rejected拒绝,失败。表示这个承诺没有做到,失败了。要实现从pending到rejected的转换,只需要在创建Promise对象时,调用reject函数。
2:代码
this . getNav ( ) . then ( res => { let id= res. data[ 0 ] . id; return this . getArticle ( id) ;
} ) . then ( res => { let id= res. data[ 0 ] . id; return this . getComment ( id)
} ) . then ( res => { console. log ( res)
} )
methods: { getNav ( callback ) { return new Promise ( ( resolve, reject ) => { uni. request ( { url: "https://ku.qingnian8.com/dataApi/news/navlist.php" , success : res => { resolve ( res) } , fail : err => { reject ( err) } } ) } ) } , getArticle ( id ) { return new Promise ( ( resolve, reject ) => { uni. request ( { url: "https://ku.qingnian8.com/dataApi/news/newslist.php" , data: { cid: id} , success : res => { resolve ( res) } , fail : err => { reject ( err) } } ) } ) } , getComment ( id ) { return new Promise ( ( resolve, reject ) => { uni. request ( { url: "https://ku.qingnian8.com/dataApi/news/comment.php" , data: { aid: id} , success : res => { resolve ( res) } , fail : err => { reject ( err) } } ) } )
}
async | await异步处理同步化
1:使用概念
1:async|await是成对出现
2:只使用await而函数中没有使用async命令,会出现报错
3:直接使用async命令,没有使用await,返回的函数是一个promise【没有实际意义】
4:async修饰函数,await是添加在调用函数的部分前该命令的含义是:得等这一行异步方法执行成功后,将返回值赋值给res变量,才可以走下一行代码
5:将原来的异步编程改为同步编程【异步处理同步化】
2:代码
async onLoad ( ) { let id, res; res= await this . getNav ( ) ; id= res. data[ 0 ] . id; res= await this . getArticle ( id) ; id= res. data[ 0 ] . id; res= await this . getComment ( id) ; console. log ( res)
}
3:同步与异步
同步
1:js代码实际上是单线程程序,代码按顺序一行一行执行
2:如果在同步编程中发送网络请求【请求超时】,下面代码依赖网络请求,那么整个网页会失去响应
异步
1:一个异步过程的执行不在于原有的序列顺序有关
2:发送网络请求【不确定响应时间,异步是最优选】,程序不在此等待,直接走下面代码,等异步请求有响应,自主完成回调后续操作,程序之间互不影响ps(1)同步按顺序执行,异步不按顺序执行,异步执行效率高(2)如果涉及到网络请求没有依赖关系的话,异步请求是效率最高的,但是下一个的方法依赖于上一个网络请求的结果,那么久必须使用await命令,将异步结果等待返回之后再执行后面的代码。