参考来源:Promise是什么
http://es6.ruanyifeng.com/#docs/promise#
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise
所谓的Promise是一个容器,它允许你为异步操作的成功和失败分别绑定相应的处理方法,返回一个能代表未来出现的结果的promise对象。
(os:什么鬼玩意,我自己看着都觉得绕口)
大白话:Promise里面保存一些未来结束的事件(异步操作),然后你可以在它的状态下绑定处理方法
Promise特点
一个 Promise有以下几种状态:
pending: 初始状态
fulfilled: 操作成功
rejected: 操作失败
(1)只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态(改变是不可能的,这辈子都不可改变的)。
(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。
文章图片
基本用法
function promise1() {
let p = new Promise(function(resolve,reject){
setTimeout(function(){
resolve('我是任务1')
},1000)
});
return p
}
promise1().then(function (data) {
console.log(data);
})
ps:为了更好的理解then方法分开写了。
Promise方法
Promise方法就那个几个,咱们先浏览器输出下看下
文章图片
从上图可看到Promise方法有all、race、reject、resolve、catch、then
其中catch、then是定义在Promise.prototype也就是原型上面的
(1)then方法-一个爱出风头的方法: 它的作用是为Promise实例添加状态改变时的回调函数,
then方法的第一个参数是resolved状态的回调函数,
第二个参数(可选)是rejected状态的回调函数。
换言之就是说,Promise不管你执行成功还是失败,获取数据都要在then做获取(then:服不服?我就问你服不服)。
注意事项:then方法返回的是一个新的Promise实例,因此可以采用链式写法,即then方法后面再调用另一个then方法
promise1().then(function (data) {
console.log(data);
return promise2()
}).then(function (data) {
console.log(data);
return promise3()
})
(2)catch方法-救护车 【前端|关于Promise的一些个人理解】大家记不记得then方法可以传两个参数(都是回调),(我们暂时就叫她们为a和b这样方便下文的理解)她们分别是执行成功的回调和失败的回调。但是如果你代码错误呢~这时候就用到catch,除了这点以外catch方法和b都是一样的,是指定Promise实例为“rejected状态”的回调函数
promise1().then(function (data) {
console.log(data);
return promise2()
},function(data) {
console.log(data);
}).catch(function (data) {
console.log(data);
})
这里我特意把then的两个回调都写了,为了看的更清楚,b回调函数和catch是一样的作用,只是如果Promise实例在a回调函数的时候代码错误(抛出异常)那么在没写catch的时候,整个js直接卡主,死机。
(3)resolve方法: 把对象转化成Promise对象
function promise3() {
let p = new Promise(function(resolve,reject){
setTimeout(function(){
resolve('我是任务3')
},1000)
}).then(function (data) {
console.log(data);
//'我是任务3'
})
return p
}
什么鬼,这不就是传值嘛,哈哈,意思差不太多~只是resolve会转化下这个对象,人家不仅仅转化对象,还可以转化Promise对象和带then的对象哦(外界叫它thenable)
返回值:
Promise.resolve(value);
//把value转化成promise对象
Promise.resolve(promise);
//直接返回promise
Promise.resolve(thenable);
//把这个对象转为 Promise 对象然后就立即执行thenable对象的then方法。
嗨呀,它就是Promise实例执行成功的回调,说了一大堆全是废话!
(4)reject方法: 相反的它就是Promise实例执行失败的回调
function promise4(){
let p = new Promise(function(resolve, reject){
setTimeout(function(){
let num = Math.random()*10;
if(num<=5){
resolve(num);
}
else{
reject('我败了');
}
}, 1000);
}).then(function(data) {
console.log(data)
},function(reason) {
console.log(reason)//拒绝原因
})
return p;
}
这个B返回一个带有拒绝原因reason参数的Promise对象
(5)all方法: 这个方法还挺别致的,可以一起发送多个异步操作
用法
Promise.all([promise1, promise2, promise3]).then(function(values) {
console.log(values);
});
all接收的是Promise对象哦,你要把多个Promise一起用数组的方式传进去。
注意:当all参数中有一个Promise对象的状态变成了rejected(失败)那么all就返回第一个失败的promise结果
这个方法嘛,就一个字酷
(6)race方法: 这个方法更别致,也是一起发送多个异步操作,但是唯一不同的是,参数的Promise对象谁有结果了那返回谁(管你失败还是成功)
let promise1 = new Promise(function(resolve, reject) {
setTimeout(resolve, 500, 'one');
});
let promise2 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then(function(value) {
console.log(value);
//two
});
差不多就以下这个意思:
race:兄弟你们两比比看谁跑的话,谁跑的快,那我让谁嘿嘿嘿
promise:好像就讲完了,那就结束吧!
finally:稍等一下,还有我呢!
promise:你谁啊~
finally:我finally
promise:行行行,补票上车
(7)finally方法: 这是一个es2018的方法,目前浏览器还不支持,看上面我在控制台输入的图。
它的意思就是我管你这个实例干嘛,反正最后我都要执行
promise1().then(result => {
// /xxx
}).catch(error => {
// /xxx
}).finally(() => {
// /xxx
});
以上就是本人对于promise的一些个人理解,如果错误之处往指正!
推荐阅读
- 操作系统|[译]从内部了解现代浏览器(1)
- web网页模板|如此优秀的JS轮播图,写完老师都沉默了
- 接口|axios接口报错-参数类型错误解决
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- vue.js|vue中使用axios封装成request使用
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- JavaScript|JavaScript — 初识数组、数组字面量和方法、forEach、数组的遍历
- JavaScript|JavaScript — call()和apply()、Date对象、Math、包装类、字符串的方法
- JavaScript|JavaScript之DOM增删改查(重点)
- 前端|web前端dya07--ES6高级语法的转化&render&vue与webpack&export