Promise

实现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 阅读详情

一 、回调地狱

 什么是回调地狱

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

 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 介绍,优雅地实现异步任务,手撕 Promise 一篇带你从入门到精通 Promise,详解介绍了 Promise 的各种使用情况,源码级剖析 Promise 内部和各种API,手撕源码徒手搭建 Promise(大厂必备!) 阅读详情

相关推荐

Promise详解-1:初识Promise

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

sharkchen的专栏 1337

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核心总结

promise核心总结

m0_68829748的博客 1223

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的博客 1729

关于 Promise

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

weixin_58467091的博客 2526

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

promise学习笔记

2301_79158740的博客 1103

使用 Promise

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

歌舞阿瓜的博客 1689

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

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

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

AI 范式越迁:使用 XXL-BOOT SKILL 实现一句话直生业务

使用 XXL-BOOT SKILL 实现一句话直生业务,AI 自动完成需求澄清、数据建模、后端与前端开发、菜单权限配置及联调验证,AI 范式及业务交付进入新时代。

许雪里 231

AI+前端提效:03 从零上手!AI 辅助前端编码:提示词模板+实操步骤

写清楚(结构化提示词) → 生成初稿(AI) → 编译验证 → 逻辑 review → 反馈修复 → 沉淀模板把这个流程走成习惯,你的编码效率至少提升 2-3 倍。记住:AI 是"初级工程师",你是"技术负责人"——你负责方向,它负责执行。下一篇,我们来看更"爽"的玩法:UI 转代码——设计稿直接变成前端页面,告别手动切图写样式。第 1 篇:告别内卷低效!AI 时代前端提效的核心逻辑与底层思维第 2 篇:2026 主流前端 AI 工具横向对比第 3 篇:从零上手!

驽马不舍 365

用 MCP 让 AI 替你画图:Trae Work + drawio-mcp 完整搭建指南

用 MCP 让 AI 替你画图:Trae Work + drawio-mcp 完整搭建指南

u010972645的博客 998

基于Python的爱奇艺视频数据可视化分析系统

长视频平台剧集、评分、热度与评论数据体量大、维度多,手工汇总难以快速把握类型结构、口碑分布与主演导演影响力。系统采用 B/S 架构,后端入口为app.py,运行端口8060;数据库使用 MySQL(库名iqiyi),经 PyMySQL 访问。前台基于 Bootstrap 5、本地中的 ECharts 5 与 echarts-wordcloud,配合主题。业务表包括usersdramascommentsfavorites。数据可通过导入,或经/ 相关脚本补充样本。分析层在。

qq_35928134的博客 201

一次搞懂如何在Vue中构建高质量的第三方Open API适

在企业级前端工程化实践中,对接第三方的开放 API(如支付网关、物流查询、地图服务或复杂的金融数据源)是不可避免的需求。对于初级开发者而言,直接在组件内通过 Axios 发起请求并解析响应是一种快速实现的方式;然而,当业务规模扩大、需要同时集成多个逻辑相似但协议迥异的服务商时,这种“直连式”开发会导致严重的耦合问题。代码库会充斥着大量针对特定厂商字段名(如 `vendor_user_id` 与 `uid` 的混用)的硬编码判断,一旦供应商更新了接口版本或更换了服务商,整个应用层的 UI 组件都需要进行大规模

wuchangjian的专栏 152

单智能体主流范式全梳理

你是 ReAct(推理+行动)智能体,必须严格按以下格式输出每一轮:Thought: 你的推理和思考过程Action: <<TOOL>>{"name":"工具名","params":{...}}<<TOOL_END>>规则:1. 每轮必须以 Thought: 开头,说明当前需要做什么、为什么这样做2. 如果需要调用工具,紧接着输出 Action: 后面紧跟 <<TOOL>>JSON<<TOOL_END>>3. 如果不需要再调用工具,以 Final Answer: 开头输出最终旅行方案。

2303_79635409的博客 278
上一篇: Node.js
这个名字浪费了我10分钟
博客等级 码龄4年 1粉丝 2原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值