当前位置: 首页 > news >正文

唐山网站建设互众动力青岛seo软件

唐山网站建设互众动力,青岛seo软件,做网站存在的问题,js做音乐网站这篇主要讲一下Promise的类方法的基本使用,至于Promise的基本使用这里就不赘述了,之前也有手写过Promise、实现了Promise的核心逻辑。其实我们平时用Promise也挺多的,不过又出现了两个新的语法(ES11,ES12新增了两个&am…

这篇主要讲一下Promise的类方法的基本使用,至于Promise的基本使用这里就不赘述了,之前也有手写过Promise、实现了Promise的核心逻辑。其实我们平时用Promise也挺多的,不过又出现了两个新的语法(ES11,ES12新增了两个),所以这篇就简单说一下,也挺简单

1. all 

Promise.all方法我们可以传入一个数组参数,数组中可以放多个Promise,它会等所有的Promise的状态都为fulfilled时,来获取最终的结果,它会把所有每个Promise resolve的结果,放在一个数组中,且结果的顺序和我们传入的数组参数中的Promise保持一直(跟时间无关)

const p1 = new Promise((resolve, reject) => {const obj = { data: '11111' }setTimeout(() => {resolve(obj)}, 3000)
})const p2 = new Promise((resolve, reject) => {const obj = { data: '22222' }setTimeout(() => {resolve(obj)}, 2000)
})const p3 = new Promise((resolve, reject) => {const obj = { data: '33333' }setTimeout(() => {resolve(obj)}, 1000)
})Promise.all([p1, p2, p3]).then(result => {console.log(result)
}).catch(err => {console.log('err:', err)
})

 上面代码会在3s后在then方法中拿到最终的结果如下:

但是all方法是有个缺陷的,当有其中一个Promise变成rejected状态时,新Promise就会立即变成对应的reject状态,也就是只能在catch中捕获到错误,其他fulfilled状态的值我们是拿不到的。因此有了allSettled方法

2.  allSettled

allSettled是在ES11(2020)中添加的新的API,Promise.allSettled

该方法会在所有的Promise都有结果时(无论是fulfilled,还是rejected)都会在then方法中拿到我们的最终的结果: 

const p1 = new Promise((resolve, reject) => {const obj = { data: '11111' }setTimeout(() => {resolve(obj)}, 3000)
})const p2 = new Promise((resolve, reject) => { const obj = { data: '22222' }setTimeout(() => {reject(obj)}, 2000)
})const p3 = new Promise((resolve, reject) => {const obj = { data: '33333' }setTimeout(() => {resolve(obj)}, 1000)
})Promise.allSettled([p1, p2, p3]).then(result => {console.log(result)
}).catch(err => {console.log('err:', err)
})

我们传入了三个Promise,在2s的时候我们的p2就reject拒绝了,但是我们同样可以拿到结果,但是这个result结果数组结构有点儿变化,我们看下打印结果: 

 我们可以看到allSettled的结果是一个数组,数组中存放着每一个Promise的结果,并且是对应一个对象的;这个对象中包含status状态,以及对应的value值

3.  race

race是竞技、赛跑的意思,也就是谁先有结果我就要谁,这个result拿到的结果就不是一个数组了,而是最快的一个Promise resolve出来的结果 

const p1 = new Promise((resolve, reject) => {const obj = { data: '11111' }setTimeout(() => {resolve(obj)}, 3000)
})const p2 = new Promise((resolve, reject) => { const obj = { data: '22222' }setTimeout(() => {resolve(obj)}, 2000)
})const p3 = new Promise((resolve, reject) => {const obj = { data: '33333' }setTimeout(() => {resolve(obj)}, 1000)
})Promise.race([p1, p2, p3]).then(result => {console.log(result)
}).catch(err => {console.log('err:', err)
})

看下控制台的打印: 

因为p3用时最短,最快,所以result拿到的就是p3resolve出的结果值,但是如果最快的那个reject了呢我们看一下: 

const p1 = new Promise((resolve, reject) => {const obj = { data: '11111' }setTimeout(() => {resolve(obj)}, 3000)
})const p2 = new Promise((resolve, reject) => { const obj = { data: '22222' }setTimeout(() => {reject('出错了~~~')}, 500)
})const p3 = new Promise((resolve, reject) => {const obj = { data: '33333' }setTimeout(() => {resolve(obj)}, 1000)
})Promise.race([p1, p2, p3]).then(result => {console.log(result)
}).catch(err => {console.log('err:', err)
})

我们修改一下代码,将p2时间设置为0.5s,且是rejected的状态,我们再看下打印结果: 

直接就会被catch捕获了,这样看来,如果最快的那个状态为rejected状态的话,那我们后面的resolve的状态也拿不到值了。如果我们想拿到最快的fulfilled状态的值,也就是如果前面有reject的,我们就忽略掉,接着等待下一个resolve的,怎么做呢,这就有了any方法

4. any 

const p1 = new Promise((resolve, reject) => {const obj = { data: '11111' }setTimeout(() => {resolve(obj)}, 3000)
})const p2 = new Promise((resolve, reject) => { const obj = { data: '22222' }setTimeout(() => {reject('出错了~~~')}, 500)
})const p3 = new Promise((resolve, reject) => {const obj = { data: '33333' }setTimeout(() => {resolve(obj)}, 1000)
})Promise.any([p1, p2, p3]).then(result => {console.log(result)
}).catch(err => {console.log('err:', err)
})

还是上一次的代码,我们把方法改为any,再看一下打印结果: 

我们在1s后就会拿到p3 resolve的结果, 那个p2 reject的就忽略掉了,那如果我们所有的Promise都是rejected状态时它会怎么做呢?我们看一下:

const p1 = new Promise((resolve, reject) => {setTimeout(() => {reject('出错了111~~~')}, 3000)
})const p2 = new Promise((resolve, reject) => { setTimeout(() => {reject('出错了222~~~')}, 500)
})const p3 = new Promise((resolve, reject) => {setTimeout(() => {reject('出错了333~~~')}, 1000)
})Promise.any([p1, p2, p3]).then(result => {console.log(result)
}).catch(err => {console.log('err:', err, err.errors)
})

我们看下打印结果: 

它就会走catch了,并且打印出了错误信息,其中的 err.errors中会有我们reject传递的错误信息,err是它内部封装的错误提示 

http://www.dinnco.com/news/46316.html

相关文章:

  • web前端开发是干什么的北京seo百科
  • 同江佳木斯网站建设怎么投放网络广告
  • 做网站开发哪种语言更稳定高效天天seo站长工具
  • 做外贸一定要独立网站吗今日新闻热点大事件
  • 用word做网站苏州seo建站
  • 小说网站开发成本广州seo公司排名
  • wordpress 浏览量墨子学院seo
  • 婚纱摄影网站管理系统seo优化大公司排名
  • 太和网站建设数据库营销
  • wordpress仿站开发广州google推广
  • 企业网站怎么备案网店代运营可靠吗
  • 石家庄网站排名优化搜狗推广登录入口
  • 个人网站首页设计欣赏浑江区关键词seo排名优化
  • 农业门户网站建设目标交换友情链接
  • 怎么注册公司域名邮箱优化大师人工服务电话
  • 表白墙网站怎么做杭州搜索引擎推广排名技术
  • 在axure中做网站首页抖音推广
  • 湖南建设部网站宁波受欢迎全网seo优化
  • 山东做网站的公司有哪些友情链接分析
  • 嵌入式软件开发工程师证书南京seo推广公司
  • 自己做个网站怎么做如何加入广告联盟赚钱
  • 做网站需要相机吗网络优化工程师骗局
  • 外贸网站模板外贸网站建设长沙百度开户
  • 网站代码隐蔽代码建立网站的流程
  • 上海影视传媒公司排名网站排名优化方法
  • 国内知名的网站建设公司win10优化大师免费版
  • 织梦快速建站百度官方版下载
  • 襄阳哪里做网站2022最好的百度seo
  • 大气红色网站宁波网站建设团队
  • 建设银行怎么加入信用网站一诺网络推广公司