名词约定
一般来讲,有以下的名词约定:
promise(首字母小写)对象指的是“Promise实例对象”
Promise首字母大写且单数形式,表示“Promise构造函数”
Promises首字母大写且复数形式,用于指代“Promises规范”
那么我们来扯一会
去年6月份, ES2015正式发布(也就是ES6,ES6是它的乳名),其中Promise被列为正式规范。作为ES6中最重要的特性之一,我们有必要掌握并理解透彻。本文将由浅到深,讲解Promise的基本概念与使用方法。
promise是什么?
1、主要用于异步计算
2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
3、可以在对象之间传递和操作promise,帮助我们处理队列
为什么会有promise?
同步:假设你去了一家饭店,找个位置,叫来服务员,这个时候服务员对你说,对不起我是“同步”服务员,我要服务完这张桌子才能招呼你。那桌客人明明已经吃上了,你只是想要个菜单,这么小的动作,服务员却要你等到别人的一个大动作完成之后,才能再来招呼你,这个便是同步的问题:也就是“顺序交付的工作1234,必须按照1234的顺序完成”。
异步:则是将耗时很长的A交付的工作交给系统之后,就去继续做B交付的工作,。等到系统完成了前面的工作之后,再通过回调或者事件,继续做A剩下的工作。
AB工作的完成顺序,和交付他们的时间顺序无关,所以叫“异步”。
new
Promise(
function(resolve, reject){
// 一段耗时的异步操作
resolve('成功')// 数据处理完成
// reject('失败') // 数据处理出错
}
).then(
(res) =>{console.log(res)},// 成功
(err) =>{console.log(err)}// 失败
)
promise.all的用法
var p1=Promise(function(resolve,reject){
setTimeout(function(){
resolve('p1完成')
},1000)
})
var p2=Promise(function(resolve,reject){
setTimeout(function(){
resolve('p1完成')
},2000)
})
var p3=Promise(function(resolve,reject){
setTimeout(function(){
resolve('p1完成')
},3000)
})
Promise.all([p3,p2,p1]).then(function(res){
console.log(res);
//p3,p2,p1是我们调用的顺序 ["p3完成","p2完成","p1完成"]是我们返回的结果
//可以看得出来,我们控制了3个异步请求的返回顺序
})
总结 :promise.all的使用场景就是可以同时处理多个异步请求并控制他们返回【结果的顺序】
注意:promise.all中的任何一个请求,都将不会有返回结果
.then()
1、接收两个函数作为参数,分别代表fulfilled(成功)和rejected(失败)
2、.then()返回一个新的Promise实例,所以它可以链式调用
3、当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行
4、状态响应函数可以返回新的promise,或其他值,不返回值也可以我们可以认为它返回了一个null;
5、如果返回新的promise,那么下一级.then()会在新的promise状态改变之后执行
6、如果返回其他任何值,则会立即执行下一级.then()
.then()里面有.then()的情况
1、因为.then()返回的还是Promise实例
2、会等里面的then()执行完,再执行外面的
promise结合await asyan封装接口API
var token = JSON.parse(localStorage.getItem('userInfo')).remember_token
function http(url, type, data = '') {
var p = new Promise((v, b) => {
$.ajax({
headers: {
Authorization: 'Bearer ' + token
},
url,
type,
data,
success: (res) => {
v(res)
},error:(er)=>{
b(er)
}
})
})
return p
}
function getNav(){
return http('http://***.**.**.***:**/api/menu/info','post')
}
function getList(pageNum,statues,nickname,mobile){
return http(`http://***.**.**.***:**/api/user?page=${pageNum}&limit=10&status=${statues}&nickname=${nickname}&mobile=${mobile}&`,'get')
}
如何使用?
使用场景:promise封装api接口
Promise进行异步操作
解决问题:1.回调多域问题2.多个并发请求