promise
异步编程的一种解决方案,promise是一个对象
promise对象的特点
- 对象状态不受外界影响
三种状态
- pending(进行中)
- fulfilled(已成功)
- rejected(已失败)
- 一旦状态改变就不会再变 缺点
- 一旦新建就会立即执行,无法中途取消
- 如果不设置回调函数,promise内部抛出的错误,不会反应到外部
- 当处于pending状态时,无法得知目前进展到哪一个阶段
基本用法
Promise.prototype.then()
为promise实例添加状态改变时的回调函数
两个参数,成功回调和失败回调
const promise = new Promise(function(resolve,reject){
if(){
resolve(value)
}else {
reject(error)
})
promise.then(function(value){
},function(error){
})
简单例子
function timeout(ms){
return new Promise((resolve,reject)=>{
setTimeout(resolve,ms,done)
})
timeout(100).then((value)=>{
console.log(value)
})
promise.prototype.catch()
指定发生错误时的回调函数
const promise = new Promise(function)
promise.all()
接收一个iterable类型(Array,Masp,Set)的输入,并且只返回一个promise实例
const p = promise.all([p1,p2,p3])
p1,p2,p3的状态全部为fulfiled,p的状态才为fulfilled p1,p2,p3之中有一个被rejected,p的状态就变成rejected
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);
});
// Array[3,4,'foo']
promise.race()
返回一个promise,一旦某个promise实例状态
率先被改变,promise.race()的状态就跟着改变
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then((value) => {
console.log(value);
});
//"two"
// promise2率先完成返回结果two