展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

promise对象

前言

  • 学习自bili-尚硅谷-promise
  • 案例已提交到gitlab
  • promise是为了解决回调地狱问题

入门

  • 案例一
<script>
btn.addEventListener("click", function(){
// promise对象是一个构造函数,接收一个函数类型的参数,封装异步操作
const p = new Promise((resole, reject) => {
setTimeout(()=>{
let n = rand(1, 100);
if(n<=30){
resole(n); // 执行成功的函数,传入参数
}else{
reject(n); // 执行失败的函数
}
}, 100);
});
// 执行回调
p.then((value)=>{ // resole函数,value是形参
alert("成功!" + value);
},(reason)=>{
alert("失败!" + reason);
})
})
</script>
  • 案例二
<script>
function sendAjax(url){
return new Promise((resolve, reject) => { // Promise函数包裹一个异步操作
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
resolve(xhr.response); // 成功时的回调
}else{
reject(xhr.status);
}
}
})
}
// 执行回调
sendAjax('http://localhost:8080/test')
.then(value => {
console.log(value);
}, reason => {
console.warn(reason);
})
</script>

promise对象的状态

  • pending 未决定
  • resolved 成功
  • rejected 失败

PromiseResult

  • 用于保存异步任务的结果(成功或失败)
  • 只有resolve函数、reject函数可以改变该结果

catch

<!-- 只有失败时才调用catch -->
<script>
let p = new Promise((resolve, reject) =>{
reject('error');
})
// 执行回调
p.catch(reason => {
console.log(reason)
})
</script>

resolve

<!-- resolve 方法 ,属于promise函数对象,不属于promise实例对象-->
<script>
// 在promise对象的resolve方法中传入参数,这个参数是非promise类型的对象,则返回的promise对象状态为成功,结果为传入的参数
let p1 = Promise.resolve(123);
// 传入一个promise类型的对象,则参数的结果决定resolve方法的结果
let p2 = Promise.resolve(new Promise((resolve, reject) =>{
reject('error');
}))
p2.catch(reason => {
console.log(reason);
})
</script>

reject

<!-- promise函数的reject方法 ,传入任何参数返回的状态都是失败 -->
<script>
let p = Promise.reject(123);
let p1 = Promise.reject('asd');
// 即使传入一个成功的promise对象,返回的状态依然是失败,返回的结果是传入的promise对象
let p2 = Promise.reject(new Promise((resolve, reject) => {
resolve(123);
}));
</script>

all、race

<script>
let p1 = new Promise((resolve, reject) => {
resolve('ok');
})
let p2 = Promise.reject('error');
let p3 = Promise.resolve('hi');
// promise函数的all方法中传入一个数组,数组中是多个promise对象
// 当数组中所有promise对象都为成功时,all方法才返回成功
// 当数组中有一个promise对象为失败结果,all方法返回失败状态,返回的失败结果为数组中失败的结果
const result = Promise.all([p1, p2, p3]);
console.log(result)
// Promise函数中race方法中传入一个数组,数组中最先改变状态的promise对象,
// 作为该方法返回的promise对象的最终状态
const result1 = Promise.race([p1, p2, p3]);
console.log(result1)
</script>

创建对象

var promise = new Promise(function(resolve, reject) {
// ...
resole(n); // 执行成功的函数,传入参数
reject(n); // 执行失败的函数
});
// 执行回调
p.then((value)=>{ // resole函数,value是形参
// ...成功状态时的操作
},(reason)=>{
// ...失败状态时的操作
})

让某个函数拥有promise功能,只需返回该对象

function myFunction(url) {
return new Promise((resolve, reject) => {
// ...
resole(n); // 执行成功的函数,传入参数
reject(n); // 执行失败的函数
});
};
// 执行回调
myFunction('http://localhost:8080/test')
.then(value => {
// ...成功状态时的操作
}, reason => {
// ...失败状态时的操作
})
posted @   DogLeftover  阅读(45)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示