一、是什么:

  promise是异步编程的一种解决方案,它是一个对象,可以获取异步操作的信息,它的出现改善了异步编程,避免了地狱回调,它比传统的解决方案回调函数和事件更合理和更强大

二、promise的三种状态:

  pending进行中,fulfilled已成功,rejected已失败

  特点

  • 对象的状态不受外界影响,只有异步操作的结果,可以决定当前是哪一种状态
  • 一旦状态改变(从pending变为fulfilled和从pending变为rejected),就不会再变,任何时候都可以得到这个结果

三、用法:

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

const promise = new Promise(function(resolve, reject) {});

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolvereject

  • resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”
  • reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”

四、实例方法

Promise构建出来的实例方法:

then():then()是成功时的回调,

    语法: p1.then(成功的回调函数[,失败的回调函数])

       通过then传递的时候,调用失败的函数,没有报错提示

catch():catch()是失败时的回调,

    语法: p1.catch(失败的回调函数)

    通过catch传递的时候,调用失败的函数,有报错提示

finally():finally无论结果如何都会执行

let p1 = new Promise(function(resolve,reject){
            setTimeout(function(){
                let num = Math.random()
                if(num>0.5){
                    // 成功
                    resolve(num)
                }else{
                    // 失败
                    reject('数字小于等于0.5')
                }
            },3000)
        })
        // 1 promise对象的then方法
        // 通过promise对象的then方法可以同时给p1传递成功和失败的回调函数
        // 语法: p1.then(成功的回调函数[,失败的回调函数])
        // 通过then传递的时候,调用失败的函数,没有报错提示
        // p1.then((data)=>{
        //     // 成功的回调函数
        //     console.log('成功了')
        //     console.log(data)
        // },(err)=>{
        //     // 失败的回调函数
        //     console.log("失败以后传递过来的信息是:"+err)
        // })
        // 2 promise对象的catch方法
        // 通过promise对象的catch方法可以给p1传递失败的回调函数
        // 语法: p1.catch(失败的回调函数)
        // 通过catch传递的时候,调用失败的函数,有报错提示
        p1.then((data)=>{
            // 成功的回调函数
            console.log('成功了')
            console.log(data)
        })
        p1.catch((err)=>{
            // 失败的回调函数
            console.log("失败以后传递过来的信息是:"+err)
        })
        // 3 promise对象的finally方法
        // 通过promise对象的finally方法可以给p1传递一个函数
        // 这个函数会在在promise结束的时候执行,不管是成功还是失败
        p1.finally(options=>{
            console.log('不管成功还是失败,只要结束了,我就会执行')
            console.log(options)
        })

五、构造函数方法

Promise构造函数存在以下方法:

  • all()
  • race()
  • allSettled()
  • resolve()
  • reject()
  • try()

all()

Promise.all()方法用于将多个 Promise实例,包装成一个新的 Promise实例

const p = Promise.all([p1, p2, p3]);

接受一个数组(迭代对象)作为参数,数组成员都应为Promise实例

实例p的状态由p1p2p3决定,分为两种:

  • 只有p1p2p3的状态都变成fulfilledp的状态才会变成fulfilled,此时p1p2p3的返回值组成一个数组,传递给p的回调函数
  • 只要p1p2p3之中有一个被rejectedp的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数

注意,如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()catch方法

const p1 = new Promise((resolve, reject) => {
resolve('hello');
})
.then(result => result)
.catch(e => e); const p2 = new Promise((resolve, reject) => {
throw new Error('报错了');
})
.then(result => result)
.catch(e => e); Promise.all([p1, p2])
.then(result => console.log(result))
.catch(e => console.log(e));
// ["hello", Error: 报错了]

如果p2没有自己的catch方法,就会调用Promise.all()catch方法

const p1 = new Promise((resolve, reject) => {
resolve('hello');
})
.then(result => result); const p2 = new Promise((resolve, reject) => {
throw new Error('报错了');
})
.then(result => result); Promise.all([p1, p2])
.then(result => console.log(result))
.catch(e => console.log(e));
// Error: 报错了

race()

Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例

const p = Promise.race([p1, p2, p3]);

只要p1p2p3之中有一个实例率先改变状态,p的状态就跟着改变

率先改变的 Promise 实例的返回值则传递给p的回调函数

const p = Promise.race([
fetch('/resource-that-may-take-a-while'),
new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('request timeout')), 5000)
})
]); p
.then(console.log)
.catch(console.error);

ES6的Promise用法的更多相关文章

  1. ES6语法 promise用法

    ES6语法 promise用法 function doSomething(){ return new Promise((resolve,reject)=>{ resolve('jjjj');// ...

  2. es6的promise用法详解

    es6的promise用法详解 promise 原理 promise是es6的异步编程解决方案, 是es6封装好的对象: 一个promise有三种状态:Pending(进行中).Resolved(已完 ...

  3. ES6之Promise用法详解

    一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...

  4. Es6 Promise 用法详解

     Promise是什么??    打印出来看看  console.dir(Promise) 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方 ...

  5. ES6 Promise 用法讲解

    Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...

  6. ES6 Promise用法讲解

    所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. ES6 规定,Promise对象是一个构造函数,用来生成Promise实例. 下面代码创造了一个 ...

  7. ES6 Promise 用法转载

    Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...

  8. 转--ES6 Promise 用法讲解

    Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...

  9. promise用法详解

    es6的promise可谓是异步书写的一大福音,过去异步js书写是函数嵌套函数的方式,promise出现后书写异步js代码就变得美观得多了 以前的写法:回调函数不停嵌套 ajax('/banners' ...

  10. ES6中promise总结

    一.什么是ES6的Promise 讲太多也没有.直接在打印出来就好,console.dir(Promise) Promise 是一个构造函数,自身有all, reject, resolve 这几个眼熟 ...

随机推荐

  1. phpexcel 小技巧

    //设置填充的样式和背景色$objPHPExcel->getActiveSheet()->getStyle( 'A1:AU1')->getFill()->setFillType ...

  2. 【每日一题】【双指针、位运算】2022年2月3日-NC103 反转字符串

    描述 写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串.(字符串长度不超过1000) 答案:双指针 import java.util.*; public class Solution { ...

  3. Scanner例题讲解

    Scanner例题讲解 题:输入多个平均数,求其总和与平均数;每输入一个数用回车确认,通过输入非数字来结束输入并输出执行结果  public class Demo05 {     //输入多个平均数, ...

  4. 看完这篇,还不懂JAVA内存模型(JMM)算我输

    欢迎关注专栏[JAVA并发] 更多技术干活尽在个人公众号--JAVA旭阳 前言 开篇一个例子,我看看都有谁会?如果不会的,或者不知道原理的,还是老老实实看完这篇文章吧. @Slf4j(topic = ...

  5. 《HTTP权威指南》– 1.HTTP概述

    HTTP的概念 HTTP : Hypertext Transfer Protocol 超文本传输协议 因特网上有数千种不同的数据类型,HTTP仔细地给每种要通过Web传输的对象都打上了名为MIME类型 ...

  6. 深入理解 Python 的对象拷贝和内存布局

    深入理解 Python 的对象拷贝和内存布局 前言 在本篇文章当中主要给大家介绍 python 当中的拷贝问题,话不多说我们直接看代码,你知道下面一些程序片段的输出结果吗? a = [1, 2, 3, ...

  7. 微服务项目Git仓库自动化脚本

    说明 基于微服务项目,产生的的多项目仓库管理脚本. 目录结构 xxxx Xxx1Api/ Xxx2Api/ git_clone_api.sh git_branch_dev.sh git_pull_al ...

  8. 历时9个月重构iNeuOS工业互联网操作系统,打造工业领域的“Office”

    目       录 1.      概述... 1 2.      整体介绍... 2 3.      主要功能简介... 5 1.   概述 历时9个月的时间,对iNeuOS工业互联网操作系统进行全 ...

  9. Javaweb后端学习笔记

    C/S结构与B/S结构: 1.C/S(Client/Server)结构:适用于个人娱乐市场[QQ等] (1).优点:安全性高.且有效降低服务器压力: (2).不足:增加服务成本.更新较繁琐: 2.B/ ...

  10. .NET 6配置EF Core数据库链接字符串

    appsetting.json { "Logging": { "LogLevel": { "Default": "Informat ...