Promise详细版

这篇具有很好参考价值的文章主要介绍了Promise详细版。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • promise基础原理到难点分析

  • 常见的Promise的方法解读

  • 扩展async和await深入分析

  • 逐步分析Promise底层逻辑代码

一、Promise基础

1.什么是promise

为了解决回调地狱:

Promise详细版,Promise,前端,javascript,开发语言

 //2.设置点击事件
        btn.onclick = function() {
            //3.创建ajax实例化对象
            let xhr = new XMLHttpRequest();
            //console.log('ajax实例化对象刚刚被创建出来:',xhr.readState)
            //4.打开请求
            xhr.open('get', 'http://iwewiki.com');
            //console.log('ajax已经打开了请求',xhr.readState)
            //5.发送请求(send方法中发送的是请求体数据,只不过get请求是没有请求体的,而post请求有请求体)
            xhr.send()
                //6.客户端接收服务端中响应回来的结果数据
            xhr.onreadystatechange = function() {
                // 2:已经完成了请求的发送
                // 3:响应结果途中还没有完全相应结果完毕...ing
                //4:已经完成了响应完毕结果了
                //console.log('0',xhr.readState)
                //7.判断
                if (xhr.readyState === 4) {
                    //status:请求的状态码200-299之间
                    if (xhr.status >= 200 && xhr.status < 300) {
                        //8.获取请求数据(JSON字符串=>json对象)
                        console.log(JSON.parse(xhr.responseText))
                    }
                }
            }
        }

2.回调地狱

promise构造函数

Promise详细版,Promise,前端,javascript,开发语言

Promise详细版,Promise,前端,javascript,开发语言

Promise详细版,Promise,前端,javascript,开发语言

 Promise详细版,Promise,前端,javascript,开发语言

Promise详细版,Promise,前端,javascript,开发语言

then方法的返回值的Promise实例化对象的状态取决于回调函数中的内容

Promise详细版,Promise,前端,javascript,开发语言

  • 如果返回为非Promise实例化对象,则得到一个是成功的Promise。

Promise详细版,Promise,前端,javascript,开发语言  

  • 如果返回的是promise实例化对象,则Promise实例化对象的状态和结构值将直接影响result常量的状态和结果值。
  •  如果为抛出异常,则新的Promise实例化对象(result)为失败的Promise

3.链式调用.then

Promise详细版,Promise,前端,javascript,开发语言

对数据库进行操作: 

 Promise详细版,Promise,前端,javascript,开发语言

Promise详细版,Promise,前端,javascript,开发语言 封装一个函数来读取文件:

4.Promise.all()

Promise详细版,Promise,前端,javascript,开发语言

Promise下的all方法作用主要是针对于多个Promise的异步任务的处理

需要接收一个数组类型的参数

返回值:Promise对象,状态也是由数组中的每一个Promise对象的状态来决定的

当所有的Promise对象的状态都是成功的,最终的结果就是成功的Promise,结果值是由每一个Promise的结果值组成的数组。

当所有的Promise对象的状态但凡有一个是失败的,最终也是失败的Promise,结果值就是失败的这个Promise的结果值

Promise详细版,Promise,前端,javascript,开发语言

Promise详细版,Promise,前端,javascript,开发语言 

5.Promise.allSettled() 

Promise详细版,Promise,前端,javascript,开发语言 

allSettled方法用来确定一组异步地操作是否都结束了(不管是成功还是失败),其中包含了fulfilled和rejected两种情况

   <script>
            function ajax(url) {
                return new Promise((resolve, reject) => {
                    let xhr = new XMLHttpRequest()
                    xhr.open('get', url, true)
                    xhr.send()
                    xhr.onreadystatechange = function() {
                        if (xhr.readyState === 4) {
                            if (xhr.status >= 200 && xhr.status < 300) {
                                resolve(xhr.responseText)
                            } else {
                                reject(xhr.responseText)
                            }
                        }
                    }
                })
            }
            Promise.allSettled([ajax('地址1'), ajax('地址2')]).then(value => {
                let errorList = value.filter(item => item.status === 'rejected')
                console.log(errorList)
            }).catch(reason => {
                console.log(reason)
            })
        </script>

6.Promise.any()

Promise详细版,Promise,前端,javascript,开发语言

有一个成功就是成功

Promise下的any方法,只要参数中有一个Promise实例化对象的状态为fulfilled,则整体结果就会为fulfilled。

如果所有Promise实力都是rejected,那么结果就是rejected

  <script>
            let p1 = new Promise((resolve, reject) => {
                resolve('ok');
            })
            let p2 = new Promise((resolve, reject) => {
                resolve('okk')
            })
            let result = Promise.any([p1, p2])
            console.log(result)
        </script>

 7.Promise.race()

 

Promise详细版,Promise,前端,javascript,开发语言

Promise.race方法是需要传递一个参数,参数为数组,数组中的内容表示的是Promise实例化对象。

如果有最想到达状态的(pending来更改成fulfilled或者是rejected),不管是成功状态还是失败的状态,都将以这个对象的状态和结果值为准。

 8.Promise.reject()

Promise详细版,Promise,前端,javascript,开发语言

 Promise.reject()方法将始终返回一个为失败的Promise对象,无论参数是否为Promise还是其他,最终都将返回失败的Promise

9.Promise.resolve()

Promise详细版,Promise,前端,javascript,开发语言

 Promise下的resolve方法作用:将一个普通的值转换成Promise类型的数据.

分两种情况:

1.当resolve方法参数为非Promise对象,则返回的结果为成功的Promise对象

Promise详细版,Promise,前端,javascript,开发语言 

2.当resolve方法参数为Promise对象,则参数对象的状态和结果将直接影响最终resolve方法的返回值的那个对象的状态和结果

Promise详细版,Promise,前端,javascript,开发语言

 10.catch

①then方法中是可以传入两个参数,当然也可以不传递,也可以只传递成功的回调函数

②也可以单独来使用catch来专门指定失败的回调函数

catch方法也有返回值,和then方法的返回值类似

catch方法也返回一个Promise实例化对象

情况1:如果失败回调函数中没有返回值,则得到一个成功的promise实例化对象,结构为undefined

情况2:如果失败回调函数中有返回值,但是这个返回值不是promise实例的情况下,则得到一个成功的promise实例化对象,结构为返回值数据

情况3:如果失败回电函数中有返回值,但是这个返回值是promise实例的情况下,则新的promise对象的状态和结果值完全取决于返回的Promise对象的状态以及结果值

Promise详细版,Promise,前端,javascript,开发语言

 当然也可以和then方法结合使用

异常(错误)穿透

   当如果有多个需要执行的成功的回调,可以不每一次都写失败回调,可以一次性统一使用最后一次catch

   当Promise实例化对象的状态为rejected,则会一直向下穿透到catch方法

Promise详细版,Promise,前端,javascript,开发语言

 11.finally

  finally是ES9中新增的特性,表示无论Promise对象变成了fulfilled还是rejected状态,最终都回执行finally方法的回调函数参数是不接受参数的。

Promise详细版,Promise,前端,javascript,开发语言

12.终止promise链条

终止Promise链条主要就是为了返回 一个pending状态的Promise实例化对象。

Promise详细版,Promise,前端,javascript,开发语言 

13.async/await

使用async结合await的终极目标:就是同步的代码来完成异步的功能

1.async函数结合await表达式

   1.1async函数中不一定要完全结合await

    1.2有await的函数一定是async函数

2.await相当于then,可以直接拿到成功的Promise实例化对象的结果值

3.await一定要写在async函数之中,但是async函数之中可以没有await

4.如果await表达式后面是Promise实例化对象,则await返回的是Promise的成功的结果值

5.如果await表达式后面的其他值,则会直接将这个值作为await的返回值

Promise详细版,Promise,前端,javascript,开发语言

 Promise详细版,Promise,前端,javascript,开发语言

 try....catch可以继续执行,并可以正常获取值

14.宏队列和微队列

JS中用来存储待执行回调函数的队列中包含了另个特定的队列

宏队列:用来保存执行的宏任务(回调),比如:定时器、DOM事件操作、ajax

微队列:用来保存执行的微任务(回调),比如:promise

JS执行的时候会区分两个队列

   --首先JS引擎会必须先将所有的同步代码都执行完

  ---每次准备取出第一个宏任务的执行之前,都需要将所有的微任务一个一个取出来执行

  ---顺序为   同--微--宏

二、手写Promise源码

Promise是一个构造函数,作用就是为了实例化对象。

语法:let 变量=new 构造函数名称();在堆内存中开辟一块空间,分配其大小以及设置其地址值0x100。

堆内存:主要存储的是引用数据类型的数据(数组、对象、函数)

栈内存:主要存储的是基本数据类型以及引用数据类型的地址值。

(一个函数如果作为另外一个方法的实际参数那么这么函数一定是回调函数)文章来源地址https://www.toymoban.com/news/detail-635274.html

到了这里,关于Promise详细版的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端开发——JavaScript的条件语句

      世界不仅有黑,又或者白 世界而是一道精致的灰  ——Lungcen     目录 条件判断语句 if 语句 if else 语句 if else if else 语句  switch语句 break case 子句 default语句 while循环语句 do while循环语句 for循环语句 for 循环中的三个表达式 for 循环嵌套 for 循环变体——for in for 循环

    2023年04月21日
    浏览(46)
  • 【JavaScript】手写Promise

    🐱 个人主页: 不叫猫先生 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏:vue3从入门到精通、TypeScript从入门到实践 📢 资料领取:前端进阶资料可以找我免

    2024年02月05日
    浏览(45)
  • JavaScript Promise

    JavaScript Promise 是一种用于处理异步操作的对象。它表示一个异步操作的最终完成或失败,并且可以处理操作的结果或错误。 Promise 对象有三种状态: 1. Pending(进行中):初始状态,表示操作正在进行中,既不是成功也不是失败。 2. Fulfilled(已完成):表示操作成功完成,并

    2024年02月06日
    浏览(41)
  • 深入理解 JavaScript Promise

    JavaScript中的Promise是一种处理异步操作的机制,它提供了一种优雅的方式来处理回调函数地狱和异步代码的流程控制。本文将深入介绍JavaScript中的Promise,帮助读者更好地理解和应用Promise。 Promise是一个代表异步操作的对象,它可以有三种状态:pending(进行中)、fulfilled(已

    2024年02月09日
    浏览(68)
  • JavaScript 之 promise

    封装和调用不是同一个人,不清楚如何调用 设计者不好设计,调用者调用很麻烦 从一个实际的例子来作为切入点: 调用一个函数,这个函数中发送网络请求(可以用定时器来模拟) 如果发送网络请求成功了,那么告知调用者发送成功,并且将相关数据返回过去 如果发送网

    2024年01月21日
    浏览(45)
  • 【前端灵魂脚本语言JavaScript⑤】——JS中数组的使用

    🐚 作者: 阿伟 💂 个人主页: Flyme awei 🐋 希望大家多多支持😘一起进步呀! 💬 文章对你有帮助👉关注✨点赞👍收藏📂 第一种: var 数组名 = new Array(); 创建一个空数组 第二种: var arr2 = new Array(10); 创建一个定长为10的数组 第三种 var arr3 = new Array(a,b,c); 创建时直接指定元素值

    2023年04月08日
    浏览(65)
  • 【JavaScript】3.4 JavaScript在现代前端开发中的应用

    JavaScript 是现代前端开发的核心。无论是交互效果,还是复杂的前端应用,JavaScript 都发挥着关键作用。在本章节中,我们将探讨 JavaScript 在现代前端开发中的应用,包括如何使用 JavaScript 来处理用户交互、动态内容、前端路由、API 请求等。 JavaScript 是处理用户交互的主要工

    2024年02月04日
    浏览(59)
  • [JavaScript理论学习] 什么是Promise (含如何判断一个值是Promise)

    本文旨在对 Promise 的规范进行解释, 便于读者在学习 Promise 的过程中梳理 Promise 之间的操作关系, 不对具体的代码实现和Promise用法进行解释. 比如, 为什么 [MDN-await] 中要提及一个 thenable 对象, 而且这个 thenable 对象 还可以和 Promise 实例 一样使用 await 等待处理, 这就涉及到了下面

    2024年02月09日
    浏览(45)
  • 【前端|Javascript第5篇】全网最详细的JS的内置对象文章!

    前言 在当今数字时代,前端技术正日益成为塑造用户体验的关键。我们在开发中需要用到很多js的内置对象的一些属性来帮助我们更快速的进行开发。或许你是刚踏入前端领域的小白,或者是希望深入了解内置对象的开发者,不论你的经验如何,本篇博客都将给你详细的讲解

    2024年02月12日
    浏览(114)
  • JavaScript如何解决返回[object Promise]

    当使用JavaScript中的Promise时,当您尝试访问Promise的值时,您可能会看到返回值为 [object Promise] 的情况。这是因为Promise是一种异步操作,它不能立即返回结果,而是需要等待操作完成后返回结果。 要访问Promise的值,您需要使用Promise的then()方法,该方法接受一个回调函数作为参

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包