Promise 对象
一、Promise对象是什么
promise的英文意思是承诺,这个承诺只是口头上的,代表他还未实现,等待我们将它实现。
而在前端技术中它本身代表目前该对象还不能使用,把它放起来,等需要的时候在调用。使用promise我们可以用同步的方式写异步的代码(这是什么意思呢?假如:盖房子,都是一根一根标准的木头叠起来的,但是中间需要一根粗的木头,也是一步一步叠加起来的,但是这个粗木头的作用现在可能看不出效果,但是在以后却能显示出效果)
1、来源:
ECMAscript 6 原生提供了Promise对象。
2、作用:
Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息
3、应用场景:
我们在发出请求调用服务器数据,由于网络延时原因,我们此时无法调用到数据,我们可以接着执行其他任务,等到将来某个时间节点服务器响应数据达到客户端,我们就可以使用Promise自带的回调函数来处理数据。
4、解决了那些问题
1、回调地狱:某个异步操作需要等待之前的异步操作完成之后才能执行,无论是回调函数还是事件都会陷入不断地的嵌套中。
###### 2、异步之间的联系:某个异步操作需要等待多个异步操作的结果,对这种联系的处理,会对代码的复杂度增加
//小李向10个女孩表白,每个女孩都会进行思考后在进行回复,当所有女孩回复完后,小李进行统计
for(let i = 0;len = Arr.length; i < len; i++){
getGirl()//表白执行的函数,由setTimeout的异步来决定女孩的思考时间,思考完后hi进入reslut
}
if(reslut.length === 10){
//开始记录日记 (这样显得麻烦,不符合设计模式的单一原则)
}
二、Promise的3种状态
我们来说一下promise的3种状态:
padding: 挂起, 处于未决阶段, 最终结果还没有出来
reslove:已处理,表示整件事情已经产生结果,并且是一个按照正常逻辑进行下去的结果。在这个状态传递一些正确数据。后续then来进行处理数据
reject:已拒绝,表示整件事情已经产生结果,并且是一个无法按照正常逻辑走向去的结果,通常用于表示有错误。后续用catch来处理数据
注意:promise实例内部的resolve也执行的是异步回调,所以不管resolve放的位置靠前还是靠后,都要等内部的同步函数执行完毕,才会执行resolve异步回调。
new Promise((resolve, reject) => {
console.log(1);
resolve(2);
console.log(3);
}).then(result => {
console.log(result);
});
/*
1
3
2
*/
三、特点
1、promise的异步结果,只能在完成状态时才能返回,而且我们在开发中是根据结果来选择来选择状态的,然后根据状态来选择是否执行then()。
2、实例化的Promise内部会立即执行,then方法中的异步回调函数会在脚本中所有同步任务完成时才会执行。因此,promise的异步回调结果最后输出。示例代码如下:
var promise = new Promise(function(resolve, reject) {
console.log('Promise instance');
resolve();
});
promise.then(function() {
console.log('resolved result');
});
for(var i=0;i<100;i++) {
console.log(i);
/*
Promise instance
1
2
3
...
99
100
resolved result
*/
四、promise存在的问题
1、promise一旦执行,无法中途取消
2、promise的错误无法在外部被捕捉到,只能在内部进行预判处理
3、promise的内如何执行,监测起来很难
正是因为这些原因,ES7引入了更加灵活多变的async,await来处理异步。