1.Promise定义
(1)Promise是用来封装一个异步操作并可以获取其结果的构造函数;
(2)Promise是异步编程的解决方案,里面保存着未来才会结束的事件的结果;
(3)Promise有3中状态:pending:初始化状态;fullfilled:成功状态;rejected:失败状态;
2.用法
Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。
function test(){
var p = new Promise(function (resolve, reject) {
//做一些异步操作
setTimeout(function(){
console.log('执行完成')
resolve('数据')
},2000)
}
return p;
}
test().then(function(data){
console.log(data)//data就是resolve中传过来的数据
})
3.Promise.then()
在then()方法中,可以接受两个函数参数,第一个value,第二个reason。
如果抛出异常: 新promise变为rejected,reason为抛出的异常
如果返回的是非promise的任意值,新promise变为resolved,value为返回的值
如果返回的是另一个新promise,此promise的结果就会成为新promise的结果
new Promise((resolve, reject) => {
resolve(1)
//reject(2)
}).then(
value => {
console.log('onResolved', value)
},
reason => {
console.log('onRejected', reason)
}
)
在then()方法中,可以直接return数据,也可以是Promise对象,如果是直接返回数据,那么在后面的then中就可以接收数据
test().then(function(data){
console.log(data)
return test1()
}).then(function(data){
console.log(data)
return '直接返回数据'
}).then(function(data){
console.log(data)//打印“直接返回数据”
})
catch用法
对抛出的异常进行处理
test().then(function(data){
console.log('resolved')
})
.catch(function(reason){
consolve.log(reason)
})
all用法
all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。all接收一个数组参数,里面的值最终都是返回promise对象。当数组中的所有promise都为resolve时才成功,有reject回调执行或输入不合法的promise就会立即抛出错误。
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
race用法
race 函数返回一个 Promise,它将与第一个传递的 promise 相同的完成方式被完成(参数中第一个执行完的promise的返回状态就是race的返回状态)。它可以是完成( resolves),也可以是失败(rejects),这要取决于第一个完成的方式是两个中的哪个。
例如:进行图片的请求
//请求某个图片资源
function requestImg(){
var p = new Promise(function(resolve, reject){
var img = new Image();
img.onload = function(){
resolve(img);
}
img.src = 'xxxxxx';
});
return p;
}
//延时函数,用于给请求计时
function timeout(){
var p = new Promise(function(resolve, reject){
setTimeout(function(){
reject('图片请求超时');
}, 5000);
});
return p;
}
Promise
.race([requestImg(), timeout()])
.then(function(results){
console.log(results);
})
.catch(function(reason){
console.log(reason);
});
requestImg()请求图片肯定不会成功,timeout函数是一个延时5秒的异步操作。当两个返回promise对象的函数放进race中,它俩就会赛跑,5秒内图片成功请求,那就进入then方法,执行正常流程,5秒内不成功,进入timeout中执行。