对Promise的理解以及Promise的基本用法

226 篇文章 5 订阅
订阅专栏
150 篇文章 2 订阅
订阅专栏
36 篇文章 0 订阅
订阅专栏

目录

一、理解Promise 

① 定义

② 优点

③ 特点

④ 缺点

二、Promise 基本用法

① resolve函数的作用 

② reject函数的作用

③ then方法 

④ 一个异步加载图片的例子

三、Promise的其他常见方法

① Promise.prototype.then()

② Promise.prototype.catch()

③ Promise.prototype.finally()

④ Promise.all()

⑤ Promise.race()

四、 Promise的常见面试题


一、理解Promise 

① 定义

1)抽象表达:

Promise是一门新的技术(ES6引入

Promise是JS中进行异步编程的新解决方案(旧解决方案是单纯使用回调函数)

异步编程包括:

fs文件读取操作、 数据库操作、AJAX网络请求、定时器

2) 具体表达:

从语法上来说,Promise是一个构造函数(可以进行对象的实例化)

从功能上来说,promise对象用来封装一个异步操作并可以获取其成功/失败的结果值

3)总结:

Promise是ES6引入的异步编程的处理方案,有三种状态:pending(进行中)、resolved(已完成)、rejected(已失败)。从语法上说,Promise是一个构造函数,可以实例化对象。封装异步操作,获取成功和失败的结果。

当Promise的状态由 pending 转变为 resolved 或者 reject 时,会执行相应的方法。

② 优点

支持链式调用,可以解决回调地狱的问题。

ES6中的 promise 的出现给我们很好的 解决了回调地狱的问题,在使用ES5的时候,在多层嵌套回调时,写完的代码层次过多,很难进行维护和二次开发以及不便于异常处理。

指定回调函数的方式更加灵活。

旧方案必须在启动异步任务前指定回调函数,而promise是在启动异步任务后,返回promise对象,给promise对象绑定回调函数(甚至可以在异步任务结束后指定多个回调函数) 。所以promise指定回调函数的方式更加灵活。

那我们可以把 promise 想象他是一种承诺,当它成功时执行一些代码,当它失败时执行一些代码。它更符合人类的行为思考习惯,而不在是晦涩难懂的冰冷语言。

③ 特点

只有异步操作的结果,可以决定当前是哪一种状态,任何其余操作都无法改变这个状态,也是“Promise”的名称的由来。同时,状态一旦改变,就无法再次改变状态。

从语法上说,Promise是一个对象,从他可以获取异步操作的消息。

④ 缺点

无法取消Promise,一旦新建他就会立即执行,无法中途取消。

其次,如果不设置回调函数,Promise内部跑出的错误无法反应到外部。当pending的时候,无法知道进展到了哪一步。

二、Promise 基本用法

ES6规定,Promise对象是一个构造函数,用来生成Promise实例。

下面代码创造了一个Promise实例。

const promise = new Promise(function(resolve, reject) {
    if(success) {
        resolve(value)
    } else {
        reject(error)
    }
})

① resolve函数的作用 

将Promise对象的状态从"未完成"变成"成功"。(即从pending变为resolved)。

将promise状态设置为成功,在异步操作成功的时候调用,并将异步操作结果作为参数传递出去。

② reject函数的作用

将Promise对象的状态从"未完成"变成"失败"(即从pending变为rejected)。

将promise状态设置为失败,在异步操作失败时调用,并将异步操作报出的错误作为参数传递出去。

③ then方法 

promise实例生成后,可以用then方法分别指定 resolved 状态和 rejected 状态的回调函数。

promise.then(function(value) {
  }, function(error) {
})

then方法可以接受两个回调函数作为参数

第一个回调函数:promise对象的状态变为resolved的时候调用;

第二个回调函数:promise对象的状态变为rejected时调用。

其中第二个函数是可选的,不一定需要提供。

这两个函数都接受Promise对象传出的值作为参数。 

function timeout(ms) {    
        return new Promise((resolve, reject) => {
            // setTimeout 传参
            setTimeout(resolve, ms, 'done') 
        })
}

timeout(100).then((value) => {
    // done
    console.log(value)
})

上面代码中 timeout方法返回一个Promise实例,表示一段时间后才会发生的结果。过了指定的时间以后,Promise实例的状态变为 resolved,就会触发 then 方法绑定的回调函数。        

let promise = new Promise(function(resolve, reject) {
    console.log('Promise')
    resolve()
})
promise.then(function() {
    console.log('resolved')
})

console.log('Hi')

// Promise   // Hi   // resolved

上面代码中,Promise新建后立即执行,所以首先输出的是Promise,然后then方法指定回调函数,将在当前脚本所有同步任务执行完成后才会执行,所以resolved最后输出。

④ 一个异步加载图片的例子

function loadImageAsync(url) {
    return new Promise(function(resolve, reject) {
        const image = new Image()     
        image.onload = function() {
            resolve(image)
        }   
        image.onerror = function() {
            reject(new Error('count not load...'))
        }
        image.src = url
    })
}

上面代码中,使用 Promise 包装一个图片加载的异步操作,如果加载成功就调用resolve方法, 否则就调用rejected方法。

⑤ fs读取文件

旧方案:回调函数方式

promise:

三、Promise的其他常见方法

文章地址: Promise的其他方法_小草莓蹦蹦跳的博客-CSDN博客

① Promise.prototype.then()

② Promise.prototype.catch()

③ Promise.prototype.finally()

④ Promise.resolve()

⑤ Promise.reject()

⑥ Promise.all()

⑦ Promise.race()

四、promise的几个关键问题

① 改变promise状态的方法

1)resolve 函数

状态会从 pending 变为resolved 

2)reject 函数

状态会从 pending 变为 rejected 

3)抛出异常

 状态会从 pending 变为 rejected 

②  一个promise指定多个成功/失败回调函数,都会调用吗?

当promise改变为对应状态时,都会调用 

③  改变 promise 状态和 then 方法指定的回调函数谁先执行?

1)都有可能,正常情况下,是先指定回调再改变状态。但也可以先改变状态,再指定回调

以上这个代码是先执行回调,再改变状态

2)如何先改变再指定回调?

① 在执行器中直接调用 resolve()/reject()

② 延迟更长时间才调用 then()

3) 什么时候才能得到数据?

① 如果先指定的回调,那当状态发生改变时,回调函数就会调用,得到数据;

② 如果先改变的状态,那当指定回调时,回调函数就会调用,得到数据。

④  promise.then() 返回的新 promise 的结果状态由什么决定?

由then()指定的回调函数执行的结果决定

1) 如果抛出异常,新 promise 变成 rejected,reason为抛出的异常;

 2) 如果返回的是非 promise 的任意值,新 promise 变为 resolved,value为返回的值;

 3) 如果返回的是另一个新 promise,此 promise 的结果就会成为新 promise 的结果。 

⑤ promise 如何串联多个操作任务?

1)promise 的 then() 返回一个新的 promise,可以看成 then() 的链式调用;

 2)通过 then 的链式调用串联多个同步/异步任务;

⑥ promise异常穿透?

1)当使用 promise 的 then 链式调用,可以在最后指定失败的回调;

  

 2)前面任何操作出了异常,都会传到最后失败的回调中处理;

⑦  中断 promise 链?

当使用 promise 的 then 链式调用时,在中间中断,不再调用后面的回调函数。如何实现?

唯一办法:在回调函数中返回一个 pending 状态的 promise 对象

原理:promise.then() 返回的新 promise 的结果状态由then()指定的回调函数执行的结果决定。如果执行状态一直是pending,那么状态就不会发生改变,自然不会触发后面的 then 方法。

 

五、 Promise的常见面试题

文章地址: Promise的常见面试题_小草莓蹦蹦跳的博客-CSDN博客

深入理解 JavaScript 中的 Promise :从基础概念到进阶用法、手写promise
Allen-
07-10 3196
PromiseJavaScript中的一种对象,用于表示一个在未来某个时间点才会完成(或失败)的异步操作及其结果。它提供了一种处理异步操作的统一接口,使代码更加简洁和易于理解。与传统的回调函数相比,Promise能够更好地处理异步操作的结果和错误。Promise作为JavaScript中处理异步操作的一种重要机制,极大地简化了代码编写和异步流程控制。
Promise理解与使用
qq_53061847的博客
07-12 2058
2.使用 promise 封装 ajax 异步请求 3.fs模块使用Promise 4.异常穿透 5. 2、为什么要用Promise? Ⅰ-指定回调函数的方式更加灵活 Ⅱ-支持链式调用, 可以解决回调地狱问题 1、什么是回调地狱 2、回调地狱的缺点? 3、解决方案? 4、终极解决方案? 3、Promise中的常用 API 概述 Ⅰ- Promise 构造函数: Promise (excutor) {} Ⅱ-Promise.prototype.then 方法: (onResolv
Promise
Wen_Tao98的博客
11-25 507
Promise 什么是promise 解决地狱回调 可以链式调用 有三种状态。 promise有哪些API. 应用场景:封装ajax,axios的get,post封装,微信小程序中封装wx.request(),uniapp开发中uni.request() 名词约定 promise(首字母小写)对象指的是“Promise实例对象” Promise首字母大写且单数形式,表示“Promise构造函数” Promises首字母大写且复数形式,用于指代“Promises规范” 什么是PromisePromise
Promise学习笔记
晴宇
04-03 1361
#目录 [TOC] 一、Promise理解与使用 1、概念: ​ Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。 通俗讲,Promise是一个许诺、承诺,是对未来事情的承诺,承诺不一定能完成,但是无论是否能完成都会有一个结果。 Pending 正在做。。。 Resolved 完成这个承诺 Rejected 这个承诺没有完成,失败了 ​ Promi
异步编程(Promise详解)
最新发布
m0_61619549的博客
08-10 996
JS是单线程语言--->异步编程--->回调函数----->promise----->async/await
谈谈对Promise理解
hddlsj的博客
02-20 5215
promise
web前端面试题对答篇:谈谈你对Promise理解
陈乾的博客
10-15 1146
回答这个问题时,个人不建议单纯的从Promise的细节知识点答起,因为这个问题的本质是拥有一定宏观性的,如果仅仅回复一些知识点恐怕是满足不了面试官胃口的。 当然,如果这个问题回答不到点上,那么后续面试官极有可能会抛出一些相关知识难点来对你进行打压。倘若知识点也回答不出来,那么只能出门右拐了…… 所以建议你结合自身项目工作经验可以考虑从以下几个点去回答即可: 1、Promise 是一个构造函数,我们可以通过该构造函数来生成Promise的实例。 2、Promise 即承诺,后续必要兑现,一旦兑现则不可更改!其
Promise理解
luzhaopan的博客
07-19 7996
一、Promise 的含义 1、Promise 是异步编程的一种解决方案,相比传统的解决方案——回调函数和事件更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了语法,原生提供了Promise 2、Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。 Promis...
深入理解ES6 Promise 扩展always方法
08-29
本文将详细介绍ES6 Promise 扩展always方法的使用方法和优点,并对其与其他Promise方法的区别进行比较。 一、ES6 Promise 的缺陷 在ES6中,Promise对象提供了then和catch两个方法,分别用于处理成功和失败的结果。...
理解JavaScriptPromise的使用
11-23
PromiseJavaScript 中用于处理异步操作的重要概念,它旨在解决回调地狱(Callback Hell)问题,即多层嵌套回调函数导致的代码可读性...理解并熟练掌握 Promise 的使用,对于编写高质量的 JavaScript 代码至关重要。
深入理解Promise.all
10-18
为了更深入地理解Promise.all,可以通过一些示例代码来观察其行为。示例代码中定义了一个异步任务函数asyncTask,它创建一个新的Promise实例,并在随机的延时后解决。通过调用Promise.all([asyncTask(1), asyncTask...
Promise理解
liyongchunscr的博客
10-14 2050
一、Promise是什么? Promise是最早由社区提出和实现的一种解决异步编程的方案,比其他传统的解决方案(回调函数和事件)更合理和更强大。 ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。 ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。 二、Promise是为解决什么问题而产生的? promise是为解决异步处理回调金字塔问题而产生的 三、Promise的两个特点 1、Promise对象的状态不受外界影响 1)pending 初始状态
Promise理解 (一)
weixin_34223655的博客
06-05 131
Promise对象编写一个读取文件 ceshi.js var fs = require('fs') function readFilepromise() { //定义一个容器 return new Promise(function (resolve, reject...
浅谈对Promise理解
weixin_45345234的博客
01-07 1191
JS中用于处理异步操作的编程模式。一个Promise是一个代理,它代表一个创建Promise时不一定已知的值。它允许我们将处理的程序与异步操作的最终成功值或失败值原因想关联起来。这使得异步方法可以像同步方法一样返回值:异步方法不会立即返回最终值,而是返回一个Promise,以便在将来的某个时间点提供该值。
谈谈你对 Promise理解
qq_29850249的博客
11-08 321
定义 Promise 是一种解决一步编程的方案,比其他传统方案(比如回调函数和事件)更合理和强大。它是位解决一步处理回调地狱问题而产生的。 三种状态 Promise 的三种状态有 pending (初始状态)、 fulfilled (成功状态)、 rejected (失败状态) 两个特点 Promise 对象的状态不受外界影响 状态不可逆 三个缺点 无法取消,新建后立即执行,无法中途取消 如果不设置回调函数, Promise 内部抛出的错误不会反映到外部 如果处于 Pending 状态时,无法得知目标
谈谈对于Promise简单的理解
weixin_60146725的博客
01-07 1773
在这里简单的说一下我对promise浅显的理解promise是ES6提出的 称之为 “回调地狱的超级英雄” 什么是回调地狱呢? 这就是一个很典型的回调地狱 这样的代码 逻辑性比较强 而且易读性不高 牵一发而动全身 如果有一次执行错误下面的回调就不会再继续执行..... 举例子说明一下: 在平常工作时调接口数据 (当然这只是我举的一些例子 仅此而已 各位后端大佬们才不会写这么折磨人的接口的........) 我们在调接口拿数据时下一个接口的调用需要依赖上一次接口返回的信息 就好比...
ES6之Promise对象
w_minx的博客
10-14 156
Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。 resolve() 状态成功->then(),reject()捕捉错误 ->catch() 一旦状态改变,就不会再变。 用Promise对象实现的 Ajax 操作的例子。 const getJSON = function(url) { const promise = new Promise(function(resolve, reject){
浅谈一下,我对Promise理解
RongKai_L的博客
05-10 887
一、Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案—回调函数和事件—更合理和更强大,ES6将其写进了标准语言,统一了用法,提供了原生Promise对象。 Promise,简单来说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,从语法上来讲,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一API,各种异步操作都可以用同样的方法进行处理。 Promise 对象有以下两个特点 对象的状态不受外界影响。Promi
Promise的一些理解
ztop_f的博客
06-16 2999
摘取部分脚本之家的描述: Promise核心说明 尽管Promise已经有自己的规范,但目前的各类Promise库,在Promise的实现细节上是有差异的,部分API甚至在意义上完全不同。但Promise的核心内容,是相通的,它就是then方法。在相关术语中,promise指的就是一个有then方法,且该方法能触发特定行为的对象或函数。 Promise可以有不同的实现方式,因此Promise...
谈谈对promise理解
10-15
Promise 是一种异步编程的解决方案,它可以避免回调地狱,使得异步操作更加清晰和易于理解Promise 有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。当 Promise 的状态从 pending 转变为 fulfilled 或 rejected 时,就称为 Promise 被“解决”(resolved)了。 在 Promise 中,我们可以使用 then 方法来处理 Promise 的结果,catch 方法来处理 Promise 的错误。同时,Promise 还提供了一些方法,如 all、race、resolve 和 reject 等,用于更加灵活地处理异步操作。
写文章

热门文章

  • PC端 -- 导航活动跳转 -- 锚点动画跳转 48200
  • Vue3 $set? 46326
  • Commitlint 使用总结 37125
  • Require statement not part of import statement.(@typescript-eslint/no-var-requires) 27428
  • Browserslist: caniuse-lite is outdated. Please run: npx update-browserslist-db@latest 24507

分类专栏

  • Vue3.x 62篇
  • 微前端 2篇
  • 安全 2篇
  • Vue1.x和Vue2.x 81篇
  • 每日专栏 226篇
  • 前端性能优化 14篇
  • Webpack 16篇
  • 微信小程序 41篇
  • ES6 36篇
  • 数组 12篇
  • JavaScript 150篇
  • Element Plus 3篇
  • Element UI 3篇
  • Ant Design 1篇
  • ESLint 2篇
  • 移动端开发常见问题 39篇
  • 正则系列 20篇
  • CSS3 55篇
  • HTML 31篇
  • Node.js 7篇
  • TypeScript 1篇
  • 思维散发 1篇
  • 算法 31篇
  • Git 7篇
  • HTTP 12篇
  • day  day up
  • VSCode 3篇
  • jQuery 2篇
  • 兼容适配IE 1篇
  • 面试题 4篇
  • 个人

最新评论

  • Browserslist: caniuse-lite is outdated. Please run: npx update-browserslist-db@latest

    风宇起不来: 感谢,方法二很管用

  • 常见的 Vue Router 的导航钩子/ 路由导航守卫

    普通网友: 这篇文章真是一篇佳作!作者运用了生动有趣的语言,将枯燥的理论知识娓娓道来,让人如沐春风。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 实现简易的 axios

    普通网友: 大佬高质量文章,图文并茂,逻辑清晰,受益匪浅,期待大佬新作。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • Browserslist: caniuse-lite is outdated. Please run: npx update-browserslist-db@latest

    镇冰: 我也是用的方法2

  • 移动端 -- 最简单的移动端适配方案(rem+vw)

    王午阳csdn: 用着可以 《手动打赏》

大家在看

  • C++ | Leetcode C++题解之第429题N叉树的层序遍历 128
  • Java | Leetcode Java题解之第429题N叉树的层序遍历 58
  • C语言 | Leetcode C语言题解之第429题N叉树的层序遍历
  • 【已解决 含pytorch 代码调试分析】pytorch 数据类型基础,与Python数据类型的区别,为什么要另外设置新的pytorch 数据类型? 570
  • Python | Leetcode Python题解之第429题N叉树的层序遍历

最新文章

  • 字符串转换为字节数组、16进制转换为base64、base64转换为字符串数组、base64转换为16进制(微信小程序)
  • 对 FileReader 的理解
  • 对 File 对象的理解
2024年15篇
2023年178篇
2022年13篇
2021年42篇
2020年121篇
2019年58篇
2018年24篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

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

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