Promise详解&Promise.all()的使用

一、Promise(承诺)

1.什么是promise

一个 Promise 对象代表一个在这个 promise 被创建出来时不一定已知值的代理。它让你能够把异步操作最终的成功返回值或者失败原因和相应的处理程序关联起来。这样使得异步方法可以像同步方法那样返回值:异步方法并不会立即返回最终的值,而是会返回一个 promise,以便在未来某个时候把值交给使用者。

2.promise用来做什么的?

异步编程的一种解决方案

                                                    

二、promise基本认知

1.promise其实就是一个构造函数:

new Promise((resolve,reject)=>{
        resolve(1)
        reject(1)
})

其中的resolvereject是两个形参,resolve代表成功,reject代表失败。

2.promise有三个状态

  • 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
  • 已兑现(fulfilled): 意味着操作成功完成。
  • 已拒绝(rejected): 意味着操作失败。

3.例如:用延时器settimeout模拟一个Ajax,我这里定义了一个变量fn,然后直接打印fn。

let fn = new Promise((resolve,reject)=>{
        setTimeout(() => {
            resolve(1)
        }, 1000);
})
    console.log(fn)

结果:

 代码执行如下:

状态由pending变为fulfilled,这就是成功的过程

promisestate:承诺状态

promiseresult:承诺结果

然后调用reject看看如下结果:

let fn = new Promise((resolve,reject)=>{
        setTimeout(() => {
            reject(1)
        }, 1000);
})
    console.log(fn)

结果:

 

代码执行:

状态由pending变为rejected,这就是成功的过程

 4.这里偷老师(csdn搜索:奥特曼)一个图让同学们能够更加直观的明白promise三个状态:

小结 

最初创建对象的状态是pending     当调用了 resolve方法时 就会进入 fulfilled 状态,当调用reject方法,就会进入 rejected 状态,当状态一旦发送改变 就不会重新改变。

                                                            

三、PromiseResult

2.1 在上面的打印中,可以看到PromiseResult和PromiseState,PromiseState上面有介绍,这里就不再解释了,说一下PromiseResult。翻译就是:承诺结果。PromiseResult的值(值可以是任意数据类型,其实就是resolve和rejected传入的参数。

那么问题来了,这么拿到PromiseResult里面的值呢?

在then和catch方法中它的参数是一个回调函数,在这个回调函数中的参数中就可以拿到resolve传过来的值,也就是promiseValue。

new Promise((resolve,reject)=>{
        setTimeout(() => {
            resolve(1)
            reject(1)
        }, 1000);
})
.then(res=>console.log(res+'成功就会执行'))
.catch(res=>console.log(res+'失败就会执行'))
.finally(()=>console.log('成功或失败都执行'))

当调用resolve函数时传递的参数,会由.then回调函数的参数接收,状态pending----fulfilled

当调用reject函数时传递的参数,会由.catch回调函数的参数接收,状态pending----fulfilled

2.2   .then的参数有两个,而且.then返回的任然是一个新的promise。

// then中有两个参数,第二个参数是可选的
new Promise((resolve,reject)=>{
        reject(1)
}).then((res)=>{console.log(res+'成功就会执行')},
(err)=>{console.log(err+'失败就会执行')})

结果:

 如果你不去接收reject的时候就会报错,显示:

 

 ok,书接上文。

 四、promise链式调用

链式调用,顾名思义,一个接着一个,像链条一样相互连接。

上面有说.then返回的仍是一个promise对象:

 let fn = new Promise((resolve,reject)=>{
            resolve(1)
        })
        let fn1 = fn.then((res)=>{})
        console.log(fn1)

结果:

 因为返回值仍是新的promise,那么就可以开始链式调用了

    let num = new Promise((resolve, rejected) => {
            resolve(1)
        })
        let num1 = p1.then((res) => {
           console.log(res); 
           return 2
        })
        num1.then((res)=>{
           console.log(res); 
        })

结果:我这里只写了.then,你可以多写点~~~

五、回调地狱

                                                             

本来就够难了,这咋还来个地狱呢,听着挺吓人。不过不要害pia~

回调地狱就是,异步代码中使用函数回调变得模糊或难以遵循的任何代码,说白了就是代码嵌套多层,可读性差,出现问题难以解决。然而promise就是可以完美解决这种问题的工具。

1.模拟ajax 回调地狱 每次调用setTimeout 都是拿到上一次的值-1

        function fn1(a) {
            setTimeout(() => {
                console.log(a);
                a--;
                setTimeout(() => {
                    console.log(a);
                    a--
                    setTimeout(() => {
                        console.log(a);
                        a--
                        setTimeout(() => {
                            console.log(a);
                            a--
                            setTimeout(() => {
                                console.log(a);
                            }, 1000);
                        }, 1000);
                    }, 1000);
                }, 1000);
            }, 1000);
        }
        fn1(5)

 使用promise

    function fn1(a) {
          new Promise((res,rej)=>{
                res(a)
            })
            .then((params)=>{
              return  new Promise((res,rej)=>{
                setTimeout(() => {  console.log(params);res(--params) }, 1000) }) 
             })
             .then((params)=>{
              return  new Promise((res,rej)=>{
                setTimeout(() => {  console.log(params);res(--params) }, 1000) }) 
             })
             .then((params)=>{
              return  new Promise((res,rej)=>{
                setTimeout(() => {  console.log(params);res(--params) }, 1000) }) 
             })
             .then((params)=>{
              return  new Promise((res,rej)=>{
                setTimeout(() => {  console.log(params);res(--params) }, 1000) }) 
             })
             .then((params)=>{
              return  new Promise((res,rej)=>{
                setTimeout(() => {  console.log(params);res(--params) }, 1000) }) 
             })        
         }
         let a=5
         fn1(a)

六、Promise.all()的使用

解释:Promise.all()方法用于将多个Promise实例,包装成一个新的Promise实例。

let promise1= new Promise((resolve, reject) => {
  resolve('promise1成功')
})

let promise2 = new Promise((resolve, reject) => {
  resolve('promise2成功')
})

let promise3= Promise.reject('promise3失败')


// Promise.all内有一个失败就会返回失败在.catch查看,反之会返回成功值在.then中查看
Promise.all([promise1, promise2 , promise3]).then((result) => {
  // result的值是个数组[]
  console.log('成功执行', result)               
}).catch((error) => {
  console.log('失败执行',error)
}).finally(()=>{
    console.log('成功或失败都会执行')
})

常见用途:需要多个接口有返回值以后再去调用其他接口,这个时候使用promise.all()非常实用。

一只大黑洋
关注 关注
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Promise.all()
代码青春
08-25 497
 
Java实现Promise.all()的示例代码
08-27
Java实现Promise.all()示例代码详解 在Java中实现Promise.all()的示例代码,提供了一个使用CountDownLatch和ThreadPoolExecutor来实现并发执行异步请求的解决方案。下面将详细介绍这个示例代码的实现思路和知识点。...
Promise笔记
dihuaooo的博客
04-04 809
Promise笔记
JavaScriptPromise.all 静态方法详解
最新发布
lph159的博客
09-18 1622
JavaScriptPromise对象的一个静态方法,专门用于处理多个并发的异步操作。它接收一个可迭代对象(通常是数组)作为参数,这个参数中包含多个Promise对象,并返回一个新的Promise。当所有的Promise都成功时,新返回的Promise会被解决(fulfilled),其值是一个包含所有输入Promise结果的数组;如果其中有任何一个Promise失败,则新返回的Promise会被拒绝(rejected),并返回第一个被拒绝的Promise的错误信息。
Promise.all() 的原理与实战:简化异步逻辑的不二选择
你若盛开,清风自来
11-25 1882
Promise.all() 方法是 JavaScript 中的一个 Promise 方法,它用于同时处理多个 Promise 对象,并返回一个新的 Promise 对象。这个新的 Promise 对象的状态取决于所有传入的 Promise 对象的状态。Promise.all() 方法的作用是将多个 Promise 对象的状态进行“聚合”,当所有传入的 Promise 对象都完成(fulfilled)时,返回的新 Promise 对象也会完成,并将所有完成的 Promise 对象的结果作为一个数组返回。
Promise
亚洲的博客
11-24 314
Promise 名词约定 一般来讲,有以下的名词约定: promise(首字母小写) 对象指的是“Promise实例对象” Promise 首字母大写且单数形式,表示“Promise构造函数” Promises 首字母大写且复数形式,用于指代“Promises规范” 什么是Promise? Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。 从语法上说,promise 是一个对象,从它可以获取异步操作的的最终状态(成功或失败) Promise是一
promise.all()使用
weixin_42978193的博客
06-14 5296
promise.all()用法
Promise.all 的使用
然后他就拿棍子来打我
12-19 1784
Promise.all() 方法是 promise 并发方法之一。它可用于聚合多个 Promise 的结果。通常在有多个相关的异步任务并且整个代码依赖于这些任务成功完成时使用
微信小程序promsie.all和promise顺序执行
08-29
本篇文章主要探讨了如何使用Promise.all和Promise顺序执行来处理特定的场景,特别是涉及图片上传的需求。 首先,Promise.all是用于并发执行一组Promise对象的。它接收一个可迭代对象,通常是数组,作为参数。当数组...
promise详解,手动实现以及上万字笔记.rar
08-16
本资源包含了一份手动实现Promise的源码(Promise.js)和一份详细的Promise详解笔记(文档.md)。以下是Promise的基础知识及深入解析: 1. **Promise状态**: - `pending`:初始状态,既没有完成也没有被拒绝。 -...
js代码-promise.all
07-14
JavaScript的世界里,Promise.all是异步编程的一个关键工具,尤其在处理多...以上就是关于"js代码-promise.all"的知识点详解。在实际开发中,熟练掌握Promise.all的使用能帮助我们更好地编写异步代码,提升代码质量。
JavaScript中的Promise使用详解
10-24
Promise还可以处理并发任务,通过`Promise.all()`方法,可以等待一组Promise全部完成,而不论它们的完成顺序。这在处理多个远程数据请求或并行操作时非常有用。例如: ```javascript let promises = [ fetch('url1...
Promise.all 用法
weixin_49066399的博客
07-18 2851
Promse.all在处理多个异步处理时非常有用,比如说一个页面上需要等两个或多个ajax的数据回来以后才正常显示。
Promise详解
Zheng_xinle的博客
09-06 5104
promise 一、什么是PromisePromise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果 从语法上说,promise 是一个对象,从它可以获取异步操作的的最终状态(成功或失败)。 Promise是一个构造函数,对外提供统一的 API,自己身上有all、reject、resolve等方法,原型上有then、catch等方法。 它也是异步编程的解决方案,他也是一种承诺,承诺过一段时间,会给你一个结果, 二、为什么有Promises这个东西 同步的方式写异
promise.all的用法(简洁易懂)
热门推荐
weixin_62765236的博客
09-23 5万+
promise.all的用法(简洁易懂)
Promise.all()使用
dream_boy_的博客
05-14 920
Promise.all()的方法用于将多个Promise实例,返回一个新的Promise实例,接收一个由promise任务组成的数组,可以同时处理多个promise任务,当所有的任务都执行完成时,即promise任务都走resolve,Promise.all()执行then()方法,会以数组的形式拿到每一项resolve结果;如果promise任务有一个失败,走reject,Promise.all()执行catch()方法,返回第一个失败的信息,并且不会走成功的then()方法。
Promise.all 使用方法
hlpp123的博客
03-24 1万+
1.await 可以获得多个promise 的返回结果 2. Promise.all 返回的也是promise,所以可以直接await Promise.all(); 1. 使用Promise function fn(){ return new Promise((resolve,reject)=>{ let randomNum = parseInt(Math.random()*6+1); console.log(randomNum); .
promise.all的使用
weixin_50070859的博客
05-31 2748
理解和使用Promise.all和Promise.race promise.all的使用 说明 Promise.all 可以将多个Promise实例包装成一个新的Promise实例,等待所有都完成(或第一个失败) 返回值 成功的时候返回的是一个数组,失败的时候则返回先被reject失败状态的值 实例代码如下 let p1 = new Promise((resolve, reject) => { resolve('成功了') }) let p2 = new Promise((resolve,
Promise.all 方法详解
07-28
Promise.all 方法是 JavaScript 中的一个高阶函数,用于将多个 Promise 对象组合成一个新的 Promise 对象。它接收一个 Promise 对象数组作为参数,并返回一个新的 Promise 对象。 当传入的 Promise 对象数组中的所有 Promise 对象都变为 resolved 状态时,返回的 Promise 对象才会变为 resolved 状态。如果数组中任意一个 Promise 对象变为 rejected 状态,则返回的 Promise 对象会立即变为 rejected 状态。 Promise.all 方法的使用方式如下: ```javascript const promises = [promise1, promise2, promise3]; Promise.all(promises) .then((results) => { // 所有 Promise 对象都已经 resolved console.log(results); }) .catch((error) => { // 任意一个 Promise 对象变为 rejected console.error(error); }); ``` 在上述示例中,`promises` 是一个包含多个 Promise 对象的数组。当所有的 Promise 对象都变为 resolved 状态时,`then` 方法中的回调函数会被执行,并且传入一个包含所有 resolved 值的数组 `results`。如果其中任意一个 Promise 对象变为 rejected 状态,则 `catch` 方法中的回调函数会被执行,并且传入第一个变为 rejected 状态的 Promise 对象的错误信息。 需要注意的是,传入 Promise.all 的数组中可以包含不仅仅是 Promise 对象,也可以包含其他类型的值。在这种情况下,这些值会被隐式地转换为 resolved 状态的 Promise 对象。 希望以上解释对你有所帮助!如果你还有其他问题,请继续提问。
写文章

热门文章

  • Vue3如何使用Pinia详细介绍、pinia持久化存储(pinia-plugin-persistedstate详细配置) 36406
  • uniapp登录拦截器(未登录点击其他地方跳转登录页) 12629
  • vite搭建完整项目 11605
  • HbuilderX 如何使用MUMU模拟器调试--详细配置! 9098
  • Uniapp-(修改数组对象某个值、点击事件、计算属性、监听、深度监听) 8683

最新评论

  • Vue3如何使用Pinia详细介绍、pinia持久化存储(pinia-plugin-persistedstate详细配置)

    一只大黑洋: 没遇到过怎么写呢,你遇到了不会自己找找问题吗,就非得别人碾压稀碎塞你脑子里吗

  • Vue3如何使用Pinia详细介绍、pinia持久化存储(pinia-plugin-persistedstate详细配置)

    m0_50123124: 丝毫不说持久化无效的问题

  • Vue3如何使用Pinia详细介绍、pinia持久化存储(pinia-plugin-persistedstate详细配置)

    weixin_62242246: paths要改为 pick 才有效

  • Vue3如何使用Pinia详细介绍、pinia持久化存储(pinia-plugin-persistedstate详细配置)

    写代码的小猿子: 好文好闻     />  フ      | ❤️ ❤️      /` ミ_꒳ノ      /      |     /  ヽ   ノ     │  | | |  / ̄|   | | |  | ( ̄ヽ__ヽ_)__)  \二つ 这篇文章真是一篇佳作!作者运用了生动有趣的语言,将枯燥的理论知识娓娓道来,让人如沐春风。文章结构严谨有条,层次分明,读起来一点也不费劲。更难能可贵的是,作者不仅深入浅出地阐述了这一领域的核心概念,还贯穿了大量的实例和案例分析,使得抽象的理论和现实生活紧密相连,让人受益匪浅。

  • vant 使用PullRefresh下拉刷新 + list列表组件时,无论滚动条在哪,下拉时总会触发下拉刷新

    不知道起啥名啊啊: 要不然还得是你呢

最新文章

  • vue2、vue3生成二维码
  • vant 使用PullRefresh下拉刷新 + list列表组件时,无论滚动条在哪,下拉时总会触发下拉刷新
  • Picker选择器(同时适用PC和手机端)
2024年9篇
2023年9篇
2022年14篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家招远玻璃钢景观雕塑兰州景观玻璃钢雕塑厂家水果雕塑玻璃钢番禺玻璃钢卡通雕塑图片山西太湖石校园玻璃钢景观雕塑青山玻璃钢花盆花器杭州卡通玻璃钢雕塑厂天津玻璃钢马雕塑制作方法福建玻璃钢香蕉雕塑中庭美陈商场装修玻璃钢雕塑喷上荧光粉的效果玻璃钢雕塑马设计哪里有宿州欧式玻璃钢雕塑设计skp商场美陈金华人物玻璃钢雕塑安装湘潭商场美陈蔡甸玻璃钢雕塑厂家玻璃钢雕塑鹿阿里巴巴常州玻璃钢雕塑销售价格定西抽象人物玻璃钢雕塑上海动物玻璃钢雕塑厂家呼和浩特商场美陈溧水商场亮化美陈奉贤区镜面玻璃钢雕塑上海玻璃钢雕塑翻模招聘丽江玻璃钢雕塑制作玻璃钢雕塑 烂标识玻璃钢雕塑定做呼市商场美陈定制东莞玻璃钢人物雕塑销售方法香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化