Promise

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

一 、回调地狱

 什么是回调地狱

 在回调函数中嵌套回调 回调地狱就是为是实现代码顺序执行而出现的一种操作, 它会造成我们的代码可读性非常差, 后期不好维护。

 setTimeout(function() {
            console.log('first');
            setTimeout(function() {
                console.log('second');
                setTimeout(function() {
                    console.log('three');
                    // .........
                }, 1000)
            }, 1000)
        }, 1000)

二 、 Promise

Promise是一个构造函数,通过new关键字实例化对象 

语法:

new  Promise((resovle,reject)=>{})

 Promise接收一个函数作为参数

 在参数函数中接收两个参数

 resolve :成功函数

 reject  :失败函数

 const p = new Promise((resolve, reject) => {})

  Promise实例

        有两个属性

        state:状态

        第一种状态  pending(准备,待解决,进行中)

        

        第二种状态  fulfilled(已完成,成功)

 

        第三种状态  rejected(已拒绝,失败)

        result: 结果

 Promise状态的改变

        通过调用resolve()resject()改变当前Promise对象的状态

        promise改变的状态是一次性的

 const p = new Promise((resolve, reject) => {
            reject() //调用函数 可以使当前promise对象的状态改为 rejected
        })
        console.log(p); //rejected

  

 const p = new Promise((resolve, reject) => {

            resolve()//调用函数 可以使当前promise对象的状态改为 resolve

        })
        console.log(p); //resolve

      

Promise的结果

 let p = new Promise((resolve, reject) => {
            // 通过调用resolve,传递参数,改变 当前Promise对象的结果
            // resolve('成功')
            reject('失败的结果')
        })
        console.dir(p) //Promise的结果为  失败的结果

 Promise的方法

    then()方法函数

    参数

    1.是一个函数 (当Promise的状态时fulfilled时执行

    2.还是一个函数 (当Promise的状态时rejected时执行

    返回值:是一个Promise对象

    在then方法的参数的函数中  通过形参使用Promise对象的结果

 const p = new Promise((resolve, reject) => {
            reject('失败的结果')
                // resolve('成功的结果')
        })
        p.then((value) => {
            // 当Promise的状态时fulfilled时执行
            console.log('成功时调用', value);
        }, (err) => {
            // 当Promise的状态时rejected时执行
            console.log('失败时调用', err)
        })
        console.dir(p);

then()方法返回一个新的Promise实例
他的状态是pending
链式操作
因为then()方法的返回值也是一个Promise

所以then()后面还可以跟then
这种情况被称为链式操作

const p = new Promise((resolve, reject) => {
            reject('失败的结果')

        })
        const t = p.then((value) => {

            console.log('成功时调用', value);
        }, (err) => {

            console.log('失败时调用', err)
        })
        console.dir(t);

返回实例的状态改变

Promise的状态不改变 不会执行then里的方法
 

      const p = new Promise((res, rej) => {
            res()
        })
        const t = p.then(value => {
            console.log('成功');
            // 如果这里的代码出错 会将t实例的状态改成rejected
            // 如果在then方法的第一个参数函数中出现代码错误 会将返回的Promise实例改为rejected状态
            console.log(a);
        }, rea => {
            console.log('失败');
        })
        t.then(value => {
            console.log('成功', value);
        }, rea => {
            console.log('失败', rea);
        })

Catch()方法

cathch中的参数函数 在什么时候被执行

1.当Promise的状态改为rejected时,被执行

2.当Promise的执行体中出现代码错误也会被执行

 const p = new Promise((res, rej) => {
            // rej()
            // console.log(a);
            throw new Error('出错了')
        });
        
        p.catch((rea) => {
            console.log('失败', rea);
        })
        console.log(p)

Promise常见写法

 new Promise((res, rej) => {
            rej(11)
        }).then(value => {
            // 成功时被执行
            console.log('成功了');
        }).catch(reason => {
            // 出错时被执行
            console.log('失败了');
        })

解决回调地狱

 // 回调地狱
        // setTimeout(function() {
        //     console.log('first');
        //     setTimeout(function() {
        //         console.log('second');
        //         setTimeout(function() {
        //             console.log('three');
        //             // .........
        //         }, 1000)
        //     }, 1000)
        // }, 1000)

        // promise 写法
        new Promise((res, rej) => {
            setTimeout(() => {
                console.log(111);
                res()
            }, 1000)
        }).then(() => {
            return new Promise((res, rej) => {
                console.log(222);
                res()
            }, 4000)
        }).then(() => {
            return new Promise((res, rej) => {
                setTimeout(() => {
                    console.log(333);
                    res()
                }, 3000)
            })
        })

await表达式


await表达式一般为promise对象,但也可以是其他的值
如果表达式是其他值 直接将此值作为await的返回值
注意 await必须在async函数中 但async函数中可以没有await
如果await的Promise失败了 就会抛出异常 需要通过try...catch捕获处理

async function main() {
            let p = new Promise((resolve, reject) => {
                    // resolve('ok')
                    reject('Error')
                })
                //1.右侧为Promise 的情况
                // let res = await p
                // console.log(res);
                // 右侧为其他类型的数据
                // let res2 = await 20
                // console.log(res2);
                // 如果Promise是失败的状态
            try {
                let res3 = await p;
            } catch (e) {
                console.log(e);
            }
        }
        main()

用async封装AJAX

 <button>点击获取</button>
    <script>
        // 用async封装AJAX
        let btn = document.querySelector('button')

        function mainAJAX(url) {
            return new Promise((res, rej) => {
                const xhr = new XMLHttpRequest();
                xhr.open('get', url)
                xhr.send()
                xhr.onreadystatechange = () => {
                    if (xhr.readyState === 4) {
                        if (xhr.status >= 200 && xhr.status < 300) {
                            res(xhr.response)
                        } else {
                            rej(xhr.readyState)
                        }
                    }
                }
            })
        }

        btn.addEventListener('click', async() => {
            try {
                let data = await mainAJAX('https://api.apiopen.top/api/getHaoKanVideo?page=0&size=2')
                console.log(data);
            } catch (e) {
                console.log(e);
            }
        })
    </script>

实现promise、call、apply、bind 实现promise、call、apply、bind 下面直接上代码,实现分析实现promise、call、apply、bind原理实现,如有问题欢迎指点。 // prmoise实现 const PENDING = 'pending' const RESOLVED = 'resolved' const REJECTED = 'rejected' function MyPromise(fn) { const that = this that.state = PENDING that.v 阅读详情

相关推荐

promise核心总结

promise核心总结

m0_68829748的博客 1227

Function和Object两大内置类及call/apply/bind

Function.prototype及call/apply/bind Function.prototype & Object.prototype Function: 所有的类(包括内置类)都是函数,每一个函数都是Function的一个实例,所以他们的__proto__一定指向的是Function.prototype 所有的函数都天生自带一个属性:prototype,这个属性指向当前实例所属类的原型 Function.prototype是一个对象,天生自带一个属性constructor,指向当前类

wendyGao_Yin的博客 339

Promise详解-1:初识Promise

不懂Promise?看这篇教程就够了

sharkchen的专栏 1347

ES5 function 扩展:call()、apply()、bind()详解

Function.prototype.call() Function.prototype.call(thisArg[, arg1[, arg2[, ...]]]) 提供新的 this 值给当前调用的函数或方法。 thisArg 在 fun 函数运行时指定的 this 值*。*需要注意的是,指定的 this 值并不一定是该函数执行时真正的 this 值,如果这个函数在非严格模式下运行,则指定...

weixin_44486539的博客 564

JS中Promise/A+规范的实现(直接上代码)

文章目录前言代码测试其它版本的实现 前言 我是跟着b站视频敲的。 视频地址:《【全网首发:完结】Promises/A+规范与源码重写【面试必备】》 https://www.bilibili.com/video/BV1nV411S7Et 视频质量很好,一边带着读英文规范,一遍写代码,说逻辑,跟着视频实现了一个完整的,符合规范的Promise对象。 在视频代码的基础上,我补充了all、race、Promise.resolve、Promise.reject、finally等方法的实现。 建议跟着视频做一遍后

SCUhzs 702

Promise的使用总结

PromiseJavaScript 中用于处理异步操作的一种机制。它提供了一种更清晰和更简洁的方式来处理异步代码,避免了回调地狱。以下是 Promise 的使用方法,包括创建 Promise、链式调用、错误处理、并行执行等。

yiguoxiaohai的博客 1736

关于 Promise

如果有任何请求失败,则整体失败。处理方式只返回成功的结果。一旦有任何一个 Promise 被拒绝,整个会立即失败,并返回那个被拒绝的 Promise 的错误。返回值返回一个包含所有成功结果的数组。如果有一个或多个请求失败,则不会返回结果,而是直接进入catch块。使用场景在你只关心所有请求都成功的情况下,适合用于并行处理需要全部成功才能继续的场景。处理方式所有请求都会被处理,不管成功与否,最终返回所有请求的状态和结果。

weixin_58467091的博客 2533

总结Promise特性以及一些关于Promise的api

promise学习笔记

2301_79158740的博客 1109

使用 Promise

Promise 是现代 JavaScript 异步编程的基础。它避免了深度嵌套回调,使表达和理解异步操作序列变得更加容易,并且它们还支持一种类似于同步编程中 try…catch 语句的错误处理方式。async 和 await 关键字使得从一系列连续的异步函数调用中建立一个操作变得更加容易,避免了创建显式 Promise 链,并允许你像编写同步代码那样编写异步代码。

歌舞阿瓜的博客 1696

promise

PromiseJavaScript 中用于处理异步操作的一种对象。它代表了一个尚未完成但承诺会在未来某个时候完成的操作,并允许你在操作完成前注册回调函数。三种状态两个过程状态只能由 Pending --> Fulfilled 或者 Pending --> Rejected,且一但发生改变便不可二次修改三个方法then:注册fulfilled状态回调函数catch:注册rejected状态回调函数finally:注册无论成功或失败都会执行的回调函数。

qq_73270720的博客 1250

Promise.all()Promise.allSettled()Promise.race() 有什么区别与联系

Promise.all()Promise.allSettled()Promise.race() 有什么区别与联系

嗨,欢迎来到我的 CSDN 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 3829

【TypeScript】Promise 深入解析

PromiseJavaScript 中一种用于处理异步操作的对象。它代表了一个未来才会完成的操作,通常用于网络请求、文件读取等异步操作的结果。PromisePending(待定):操作还未完成。Fulfilled(已完成):操作成功完成。Rejected(已拒绝):操作失败。在Promise完成时,我们可以通过.then()或.catch()方法来处理操作结果或错误。Promise还可以通过async和await语法来简化异步操作的处理。Promise

lph159的博客 2516

Promisepromise的理解和使用

文章目录1 什么是Promise1.1 理解1.2 Promise的状态改变1.3 Promise的基本流程1.4 Promise的基本使用2 使用Promise的意义2.1 指定回调函数的方式更加灵活2.2 支持链式调用,可以解决回调地狱问题3 如何使用Promise3.1 API3.2 promise 的几个关键问题3.2.1 如何改变 promise 的状态?3.2.2 一个 promise 指定多个成功 / 失败回调函数,都会调用吗?3.2.3 改变 promise 状态和指定回调函数谁先谁后?3.

weixin_45980065的博客 1933

手写Promise

若要使缺乏完整 promise 实现的浏览器符合规范,或将 promise 添加到其他浏览器和 Node.js 中,请查看。​ 上面提到的库,以及ES6中实现的Promise,还有我们手写的Promise其实都是按照标准进行编写的,那么如何测试是否符合标准呢。无论是早期实现了Promise的第三方库,以及现在的新式浏览器内置的Promise,都是符合。手写Promise-链式编程-fulfilled状态-返回Promise。是社区推出的规范,最早Promise也是社区推出并实现的,旨在规范。

weixin_42782004的博客 1230

Promise详解-2:Promise的进阶使用

不懂Promise的进阶?这篇文章直接教会你

sharkchen的专栏 1400
上一篇: Node.js
这个名字浪费了我10分钟
博客等级 码龄5年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值