promise:一文理解promise常用的方法

news2024/10/5 0:46:09

目录

第一章 介绍promise

1.1 简介

1.2 什么是地域回调

第二章 promise理论

2.1 promise的状态

2.2 promise对象的值

2.3 promise构造函数

2.4 Promise.resolve()与Promise.reject()

2.5 promise常用的几种方法 

2.5.1 Promise.all(promises)

2.5.2 Promise.race(promises)

2.5.3 Promise.finally

2.6 promise状态修改

2.7 promise执行多个回调 

2.8 改变promise状态和指定回调函数(.then)执行顺序

2.9 then方法返回的结果由什么决定

2.10  promise串联多个任务

2.11 异常穿透现象catch

2.12 中段promise链


第一章 介绍promise

1.1 简介

Promise 是ES6 新增的一个异步调用解决方案,它的出现是为了解决异步函数的 回调地狱 的问题

1.2 什么是地域回调

  • "回调地域":指的是编程当中"多级的异步的嵌套调用"的问题
  • 简单的说就是一个函数里面又套用了一个函数,跟“套娃”一样,当然,如果回调函数少的话,问题还是不是特别大,嵌套的函数很多时,如果这嵌套内的一个函数出现了问题,那么我们一下定位不到问题所在。

第二章 promise理论

let p = new Promise((resolve,reject)=>{
    resolve('ok')
})
console.log('了解promise', p)

  • 我们先了解这3个API,Prototype -> Promise 表示promise类型;PromiseState以及PromiseResult很重要,如下:

2.1 promise的状态

PromiseState 

  • 三种状态:pending(等待态)、resolved/fullfilled(成功态)、rejected(失败态)
  • 只有两种可能的变换 —— 从等待态转变为成功态或者等待态转变为失败态
  1. pending -> resolved/fulllfilled 
  2. pending -> rejected
  • 一个promise对象只能改变一次,状态由等待态发生改变之后就不会再发生改变了
  • 无论成功还是失败都会有一个结果数据
  • 注意该文章:成功的结果一般为value,失败的结果一般为reason

2.2 promise对象的值

PromiseResult 

  • 保存对象(成功/失败)的结果:resolve的结果/reject的结果

2.3 promise构造函数

// promise构造函数
const p = new Promise((resolve, reject) => {
    // 对于(resolve, reject) => {}中的代码是同步执行的代码
    // 执行器函数里面确定返回的状态与值
    // 修改对象的状态为rejected失败状态
    reject('error')
})
// 执行catch方法
p.catch(reason=>{
    console.log('报错',reason)
})

// promise构造函数
const p1 = new Promise((resolve, reject) => {
    // 对于(resolve, reject) => {}中的代码是同步执行的代码
    // 执行器函数里面确定返回的状态与值
    // 修改对象的状态为fulfilled成功状态
    resolve('success')
})
// 执行catch方法
p1.then(value=>{
    console.log('成功',value)
})

Promise(excutor)

  • excutor函数:执行器函数(resolve,reject) =>{}
  • resolve函数:内部定义成功时我们调用的函数value=>{}
  • eject函数:内部定义失败时我们调用的函数reason=>{}
  • 说明:对于excutor执行器函数会在Promise内部立即同步调用,异步在执行器中执行

2.4 Promise.resolve()与Promise.reject()

const p1 = Promise.reject('reject:p1')
const p2 = Promise.resolve('resolve:p2')
const p3 = Promise.resolve('resolve:p3')
const p4 = Promise.resolve(new Promise((resolve, reject) => {
    resolve('resolve-Promise:p4')
}))
console.log(p1,p2,p3,p4)

  • Promise.resolve():返回一个成功的数据/失败的promise对象
  • Promise.reject():返回一个失败的promise对象
  1. 返回一个状态为:rejected失败,结果为:reject:p1的promise对象
  2. 返回一个状态为:fulfilled成功,结果为resolve:p2的promise对象
  3. 返回一个状态为:fulfilled成功,结果为resolve:p3的promise对象
  4. 返回了一个promise对象,状态为fulfilled成功,结果为该promise对象里返回的结果:resolve-Promise:p4

2.5 promise常用的几种方法 

let p1 = new Promise((resolve,reject)=>{
    resolve('ok')
})
// let p2 = Promise.resolve('success')
let p2 = Promise.reject('no')
let p3 = Promise.resolve('yes')
// let p3 = Promise.reject('No')
const resultAll = Promise.all([p1,p2,p3])
const resultRace = Promise.race([p1,p2,p3])
console.log('all', resultAll)
console.log('race', resultRace)

  • promises: 包含n个promise的数组 

2.5.1 Promise.all(promises)

  • 返回一个新的promise只有所有的promise都成功才成功(PromiseResult为每个成功状态的数组), 只要有一个失败就直接失败(PromiseResult为最先失败的那个值)
let p1 = new Promise((resolve,reject)=>{
    resolve('ok')
})
let p2 = Promise.resolve('success')
// let p2 = Promise.reject('no')
let p3 = Promise.resolve('yes')
// let p3 = Promise.reject('No')
const resultAll = Promise.all([p1,p2,p3])
console.log('all', resultAll)

 

2.5.2 Promise.race(promises)

  • 返回一个新的promise,第一个完成的promis的结果状态就是最终的结果状态,不管是失败还是成功
let p1 = new Promise((resolve,reject)=>{
    reject('ok')
})
let p2 = Promise.resolve('success')
// let p2 = Promise.reject('no')
let p3 = Promise.resolve('yes')
// let p3 = Promise.reject('No')
const resultRace = Promise.race([p1,p2,p3])
console.log('race', resultRace)

 

2.5.3 Promise.finally

  • finally方法的回调函数不接受任何参数,也不知道前面的 Promise 状态到底是fulfilled还是rejected,但是最终都会执行finally的方法

2.6 promise状态修改

let p = new Promise((resolve, reject) => {
    // 1、resolve函数 pending==>fullfilled 等待态转变为成功态
    // resolve('ok')
    // 2、resolve函数 pending==>reject 等待态转变为失败态
    // reject('error')
    // 3、抛出错误
    throw '111'
})
console.log(p)
  • 1、resolve函数 pending==>fullfilled 等待态转变为成功态

  • 2、resolve函数 pending==>reject 等待态转变为失败态

  • 3、抛出错误

2.7 promise执行多个回调 

let p = new Promise((resolve, reject) => {
    resolve('ok')
})
p.then(value=>{
    console.log(value)
})
p.then(value=>{
    alert(value)
})
console.log(p)
  • 一个promise指定多个成功/失败回调函数,当promise改变为对应的状态时,都会调用 

2.8 改变promise状态和指定回调函数(.then)执行顺序

let p = new Promise((resolve, reject) => {
    // setTimeout(()=>{
    resolve('ok')
    // },2000)
})
p.then(value=>{
    console.log('value', value)
},reason=>{
    console.log('reason', reason)
})
console.log('p', p)
  •  都有可能,正常情况也可以先改变状态再执行回调,但先执行指定回调再改变状态
  • 如何先改变状态再指定回调?——先在执行器中直接调用resolve()/reject(),再调用.then;
  • 如何先先执行指定回调再改变状态?——在执行器中给resolve()/reject()设置定时器,延迟执行

2.9 then方法返回的结果由什么决定

let p = new Promise((resolve, reject) => {
    resolve('ok');
});
//执行 then 方法
let result = p.then(value => {
    //1. 抛出错误
    throw '出了问题';
    //2. 返回结果是非 Promise 类型的对象
    // console.log("value", value);
    // return 521;
    //3. 返回结果是 Promise 对象
    // return new Promise((resolve, reject) => {
    //     resolve('success');
    //     // reject('error');
    // });
}, reason => {
    console.warn(reason);
});
console.log("result", result);
  • 1、throw抛出错误

 

  • 2、返回结果是非 Promise 类型的对象

-- then方法内部return值,最终promiseState结果为fulfilled,promiseResult结果为return的值

 -- then方法内部直接执行console.log("value", value),不return ,最终promiseState结果为fulfilled,promiseResult结果为return的值,没有return默认undefined

  •  3、返回结果是 Promise 类型的对象

-- 看promise对象返回的时什么值和状态

 

2.10  promise串联多个任务

let p = new Promise((resolve, reject) => {
    setTimeout(()=>{
        resolve('ok')
    },2000)
})
p.then(value=>{
    console.log(value)
    return new Promise((resolve, reject) => {
        resolve('success')
    })
}).then(value=>{
    console.log(value) //success
}).then(value=>{
    console.log(value) //undefined
})
  • promise的then()返回一个新的promise,可以看成then()的链式调用;通过then的链式调用串联多个同步/异步任务

2.11 异常穿透现象catch

let p = new Promise((resolve, reject) => {
    setTimeout(()=>{
        resolve('ok')
    },2000)
})
p.then(value=>{
    console.log(value)
    return new Promise((resolve, reject) => {
        resolve('success')
    })
}).then(value=>{
    console.log(value) //success
    throw '111'
}).then(value=>{
    console.log(value)
}).catch(reason=>{
    console.warn(reason)
})
  • 异常穿透:当使用promisee的链式调用时,可以在最后指定失败的回调;前面任何操作出了异常,都会传到最后失败的回调中处理,之后不再执行后面的回调函数

2.12 中段promise链

let p = new Promise((resolve, reject) => {
    setTimeout(()=>{
        resolve('ok')
    },2000)
})
p.then(value=>{
    console.log(value)
    return new Promise((resolve, reject) => {
        resolve('success')
    })
}).then(value=>{
    console.log(value) //success
    console.log(111)
    // throw '111'
    return new Promise(()=>{})
}).then(value=>{
    console.log(value) //undefined
    console.log(222)
}).then(value=>{
    console.log(value) //undefined
    console.log(333)
}).catch(reason=>{
    console.warn(reason)
})
  • 中断promise链的唯一方法:在回调函数中返回一个pendding状态的promise对象--return new Promise(()=>{})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1321904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch的使用总结

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。 put/post请求:http://localhost:9200/索引库名称 {"settings":{"index":{"number_of_shards":1, # 分片数量…

HQL的其他优化

CBO优化 CBO是指Cost based Optimizer,即基于计算成本的优化。 在Hive中,计算成本模型考虑到了:数据的行数、CPU、本地IO、HDFS IO、网络IO等方面。Hive会计算同一SQL语句的不同执行计划的计算成本,并选出成本最低的执行计划。目前…

在Java中高效使用Lambda表达式和流(Streams)的技巧

Java中如何高效使用Lambda表达式和流(Streams)的技巧 1. 简介 在Java中,Lambda表达式和流(Streams)是Java 8引入的两个强大的特性。Lambda表达式为Java添加了一种简洁的方式来实现函数式编程,而流提供了一…

056:vue工具 --- CSS在线格式化

第056个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

【Unity 实用工具篇】✨| I2 Localization 实现本地化及多种语言切换,快速上手

前言【Unity 实用工具篇】| I2 Localization 实现本地化及多种语言切换,快速上手一、多语言本地化插件 I2 Localization1.1 介绍1.2 效果展示1.3 使用说明及下载二、插件资源简单介绍三、通过示例快速上手3.1 添加 Languages语种3.2 添加 Term资源3.3 静

如何确保对称密钥管理的存储安全?

确保对称密钥管理的存储安全是保障信息安全的重要一环。以下是一些建议,以确保对称密钥管理的存储安全: 使用安全存储设备:选择使用经过验证的安全存储设备来存储对称密钥。这些设备通常具有高度的物理安全性,可以防止未经授权的访…

【CLion】使用CLion开发STM32

本文主要记录使用CLion开发STM32,并调试相关功能 使用的CLion版本:2023.3.1 CLion嵌入式配置教程:STM32CubeMX项目 |CLion 文档 (jetbrains.com) OpenOCD官网下载:Download OpenOCD for Windows (gnutoolchains.com) GNU ARM工…

面试每日三题

MySQL篇 MySQL为什么使用B树索引 B树每个节点可以包含关键字和对应的指针,即B树的每个节点都会存储数据,随机访问比较友好,B树的叶子节点之间是无指针相连接的 B树所有关键字都存储在叶子节点上,非叶子节点只存储索引列和指向子…

【算法Hot100系列】删除链表的倒数第 N 个结点

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Mac安装Nginx

一起学习 1、确认你的电脑是否安装homebrew,打开电脑终端 输入: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"2、确认homebrew是否安装成功,在终端输入: br…

表格的合并

1.需要实现的效果 use-span-method.js文件 * 合并相同数据,导出合并列所需的方法(只适合el-table)* param {Object} data* param {Object} rowSpanArray*/ export function getRowSpanMethod(data, rowSpanArray) {/*** 要合并列的数据*/const rowSpanNumObject {}…

读取spring boot项目resource目录下的文件

背景 项目开发过程中,有一些情况下将配置文件放在resource下能简化代码实现和部署时的打包步骤。例如: 项目中使用的数据库升级脚本、初始化脚本。将文件放到resource下,打包在jar包中,不能直接通过File路径读取。下面介绍两种读…

论文降重方法同义词替换的实际应用与成效评估

大家好,今天来聊聊论文降重方法同义词替换的实际应用与成效评估,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 标题:论文降重方法同义词替换的实际…

【文末送书】OpenCV4工业缺陷检测的六种方法

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

刷题第四十七天 583. 两个字符串删除操作 72. 编辑距离

class Solution:def minDistance(self, word1: str, word2: str) -> int:# dp: 以i - 1结尾的word1和以j - 1结尾的word2相同需要的最小步数# if word1[i - 1] word2[j - 1]: dp[i][j] dp[i - 1][j - 1]# else: dp[i][j] min(dp[i - 1][j], dp[i][j - 1]) 1dp [[0] * (…

postman脚本生成可执行文件(6)

一.通过Python脚本(executescript.py)执行newman指令 #!usr/bin/python import subprocess from datetime import datetimeclass Newman_automate():Newman_automate():该类主要是定义postman脚本执行__path:cmd命令行中执行newnan脚本指令(…

DataGrip 2023.3 新功能速递!

1 数据可视化 自 DataGrip 2023.3 发布以来,已整合 Lets-Plot 库,实现数据可视化。该可视化功能可用于所有三种类型的网格: 主选项卡:在打开表、视图或 CSV 文件时,在分割模式下显示图表。结果选项卡:在 服…

OO AutoBackup 6: 自动备份同步文件工具箱软件

保护您的数据,让备份变得轻松简单。 概述 O&O AutoBackup 6 是一款功能强大的自动备份同步文件工具箱软件。通过实时监控您的文件和文件夹,O&O AutoBackup 6 确保您的重要数据始终得到保护。无论您是在工作还是在家庭环境中,这款软…

二叉树【数据结构】

目录 二叉树1. 二叉树定义二叉树的存储定义 2. 遍历二叉树(1) 前序遍历(2) 中序遍历(3) 后序遍历(4) 层序遍历 3. 二叉树的相关操作(1) 二叉树的初始化(2) 二叉树的结点的手动创建(3) 二叉树结点的个数(4) 二叉树叶子结点的个数(5) 二叉树的高度(6) 第k层结点个数(7) 通过前序遍…

Vue中父子Props传值不能修改的原因分析以及解决办法

Vue 官方文档中对于 Prop 的定义: Prop 是你可以在组件上注册的一些自定义属性。当一个值传递给一个 props 属性的时候,它就变成了那个组件实例的一个属性。为了给子组件传递数据,我们需要在该组件上使用 v-bind 指令绑定需要传递的数据。 由…