**
promise(特点,项目中如何应用)
**
一、promise是什么
简单来说promise就是构造函数,它就是为了解决异步编程的一种解决方案,也就是将回调函数异步编程的方法 转成 relsove和reject触发事件
promise有三种状态:
- 初始状态 pendind
- 操作成功 fulfilled
- 操作失败 rejected
Promise 对象的状态改变,只有两种可能:
项目中如何应用?
1、从pending变为fulfilled,就是将promise对象的状态从初始状态变为了成功状态,也就是异步操作成功时会调用,将异步操作的结果作为参数传递出去
还有一种可能就是
2.从pending变为rejected,就是将promise对象的状态从初始状态变为了失败状态,也就是异步操作失败时会调用,将异步操作爆出的错误作为参数传递出去
对象内含有7个方法,
then()异步请求成功后
catch()异步请求错误的回调方法
finally()请求之后无论是什么状态都会执行
resolve()将现有对象转换为Promise对象
all()此方法用于将多个Promise实例包装成一个新的promise实例。
race()也是将多个Promise实例包装成一个新的promise实例
reject()返回一个状态为Rejected的新Promise实例。
有点:让回调函数变成了规范的链式写法,程序流程可以看的很清楚
缺点:编写的难度比传统写法高,阅读代码也不是一眼可以看懂
二、promise的特点
- Promise的状态一旦改变就无法更改
new Promise(function(resolve,reject){
resolve();
reject();
}).then(function(res){
}).catch(function(){
})
只会执行then中的方法,不会执行catch中的
2. then方法的参数期望是函数,传入非函数则会发生值穿透
new Promise(function(resolve,reject){
resolve(123);
}).then('ASDASDAS').then(function(res){
console.log(res)
})
会执行第二个then的回调
3.promise的回调是同步的,then是异步的
new Promise(function(resolve,reject){
console.log(1);
resolve();
}).then('ASDASDAS').then(function(res){
console.log(2)
})
console.log(3)
输出结果为 1 3 2
4、链式调用then,上一个then的返回值是下一个then接收到的参数,如果抛出错误,会返回一个状态为reject的promise
new Promise(function(resolve,reject){
resolve();
}).then(function(){
return 123
}).then(function(last){
console.log(last)
})
打印123
new Promise(function(resolve,reject){
resolve();
}).then(function(){
throw new Error("I'm error ")
}).then(function(last){
console.log(last)
}).catch(function(error){
console.log("error:"+error)
})
打印Error: I’m error
如果是then的回调中return new Error() 还是要进入下一个then中,要throw抛出错误才会进入到catch中
5.如果返回的是promise 那么会等待promise的异步执行,根据异步执行的是resolve,还是reject再进入then或者catch
new Promise(function(resolve,reject){
resolve();
}).then(function(){
return new Promise(function(resolve,reject){
setTimeout(function(){
resolve("go to then")
},3000)
})
}).then(function(last){
console.log(last)
}).catch(function(error){
console.log("error:"+error)
})
三秒之后打印:go to then