目录
promise实例使用then方法后任然是一个promise,可以继续调用then
传入的参数,要是可以迭代的对象,如果不是promise,会自动转化为promise对象
promise的产生是为了解决回调地狱的问题。promise是一个对象,有属性和方法。
基本格式:状态和方法
一个promise实例有三个状态:pending(等待),resolve(成功解决),resolved(成功解决后)。
或者pending(等待),reject(失败),rejected(失败后)。
promise有then方法,可以通过resolve和reject传给then数据,resolve和reject里面存放数据。
<script>
// promise书写的格式,一个promise要经历三个状态,pending ,resolve ,reject
const a =new Promise((resolve,reject)=>{
// 执行resove后就是resolved状态
resolve("传给then");
// 执行reject后就是rejected状态
// reject();
});
// 返回的也是一个promise对象,因此也可以继续调用then方法
a.then(
// 当是resolve()执行的时候,就显示secucess
(data)=>{
console.log("secucess",data);
},
()=>{
console.log("error");
},
)
</script>
promise实例使用then方法后任然是一个promise,可以继续调用then
上一个then控制下一个then,默认下一个then执行成功
<script>
// promise书写的格式,一个promise要经历三个状态,pending resolve ,reject
const a =new Promise((resolve,reject)=>{
// 执行resove后就是resoved状态
resolve("传给then");
// 执行reject后就是rejected状态
// reject();
});
// 返回的也是一个promise对象,因此也可以继续调用then方法
a.then(
// 当是resove()执行的时候,就显示secucess
(data)=>{
console.log("secucess",data);
// 默认
// return undefined;
// 等价于 ,前面一定要加new
return new Promise(reject=>{
// resove();
reject();
})
},
()=>{
console.log("error");
},
).then(
//箭头函数的参数只有一个的时候可以去掉括号
data=>{
// 调用哪一个程序是由上一个then控制的,默认是成功
console.log("secucess2");
},
error=>{
console.log("error2");
}
)
</script>
catch处理错误的,reject
catch是then的特里专门处理失败
第一个promise是失败,紧接这是成功,那么会跳过成功,去执行下面的catch函数。
<script>
const a = new Promise(
(resolve ,reject)=>{
// revose();
reject();
}
)
a.then(
data=>{
console.log("yes1")
}
).catch(err=>{
console.log("no1");
}
)
</script>
promise对象的简写
promise.resolve()
promise.resolve() 前面不要加new
const a =new Promise( resolve=>{
resove();
})
// 可以简写为一下形式,如果只有成功
Promise.resolve();
promise.resolve()的应用
当使用setinterval定时器的时候,应该是循环定时发送数据(实现的时候没有循环发送),如果是延迟发送应该使用延迟器?
//一般参数
Promise.resolve("hello").then(data=>console.log("yes",data))
// 非一般参数
// Promise.resolve("hello").then
const p1 = new Promise(resolve=>{
setInterval(()=>{
resolve("hello")
},1000)
})
p1.then(
data=>{
console.log(data);
}
)
promise.reject()
管理多个promise对象
promise.all()
管理多个promise对象, const p = Promise.all([p1,p2]);
<script>
const delay=(ms)=>{
return new Promise(
resolve=>{
setTimeout(resolve,ms);
}
);
};
//then才开始调用promise对象
const p1 =delay(1000).then(()=>{
console.log("p1完成");
return "p3";
});
const p2 =delay(2000).then(()=>{
console.log("p2完成");
return "p2";
});
const p = Promise.all([p1,p2]);
p.then(
data=>{
//接受的参数是组会成的promise中then中return后的对象
console.log(data,"yes");//(2) ["p3", "p2"] "yes"
},
err=>{
console.log(err);
}
)
</script>
只有管理的多个状态在执行resolve后,状态为resolved,promise.all()对象才执行成功,如果管理的子promise对象有个状态是rejected那么立刻执行失败。
<script>
const delay=(ms)=>{
return new Promise(
resolve=>{
setTimeout(resolve,ms);
}
);
};
//then才开始调用promise对象
const p1 =delay(1000).then(()=>{
console.log("p1完成");
// return "p3";
return Promise.reject("失败1")
});
const p2 =delay(2000).then(()=>{
console.log("p2完成");
return "p2";
});
const p = Promise.all([p1,p2]);
p.then(
data=>{
//接受的参数是组会成的promise中then中return后的对象
console.log(data,"yes");//(2) ["p3", "p2"] "yes"
},
err=>{
console.log(err,"no");//失败1 no
}
)
</script>
promise.race()
第一个子promise 成功则父promise成功,第一个失败则失败
promise.allSettle()
then里面只有函数反应子promise 的成功和失败,不管成功还是失败都记录
<script>
const delay=(ms)=>{
return new Promise(
resolve=>{
setTimeout(resolve,ms);
}
);
};
//then才开始调用promise对象
const p1 =delay(1000).then(()=>{
console.log("p1完成");
// return "p3";
return Promise.reject("失败1")
});
const p2 =delay(2000).then(()=>{
console.log("p2完成");
return "p2";
});
// 管理多个promise对象
const p = Promise.allSettled([p1,p2]);
p.then(
//只有一个记录,不管子promise失败还是成功都记录
data=>{
//接受的参数是组会成的promise中then中return后的对象
console.log(data,"yes");//(2) ["p3", "p2"] "yes"
},
)
</script>
注意事项
传入的参数,要是可以迭代的对象,如果不是promise,会自动转化为promise对象
<script>
// 会将其自动转化为promise对象
Promise.all([1,2,3]).then(
data=>{
console.log(data);//(3) [1, 2, 3]
}
)
// 等价于
// promise.resolve() 前面不要加new
const a = Promise.resolve(1);
const b =Promise.resolve(2);
const c = Promise.resolve(3);
Promise.all([a,b,c]).then(
data=>{console.log(data);} //(3) [1, 2, 3]
)
</script>
管理多个promise对象,出现错误
可以单个处理,也可以在父promise对象处处理,使用catch()方法。