promise概述

介绍

promise是ES6的重要特性之一

传统的异步编程的解决方案是使用回调函数,但是这样就会导致嵌套过深,产生回调地狱,那么promise异步编程的另一种解决方案,而且会更加的强大。

三种状态

  • pending(待定)初始状态,既没有被兑现,也没有被拒绝
  • fulfilled(已兑现)意味着操作成功完成
  • rejected(已拒绝)意味着操作失败。

特点

  • 待定状态的 Promise 对象要么会通过一个值被兑现(fulfilled),要么会通过一个原因(错误)*被拒绝(rejected)*当这些情况之一发生时,我们用 promise 的 then 方法排列起来的相关处理程序就会被调用
  • Promise.prototype.thenPromise.prototype.catch 方法返回的是 promise, 所以它们可以被链式调用

promise的三个实例方法

then()方法

  • then是实例状态发生改变时的回调函数,第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数
  • then方法返回的是一个新的Promise实例,也就是promise能链式书写的原因
promise.then(result => {···})

catch方法

当出现异常 则需要catch方法进行捕获

promise.then(result => {···}).catch(error => {···})

finally()方法

方法用于指定不管 Promise 对象最后状态如何,都会执行的操作

promise.then(result => {···}).catch(error => {···}).finally(() => {···});

promise的静态方法

resolve方法

方法返回一个以给定值解析后的Promise 对象
定值有以下几种情况:

  • 如果这个值是一个 promise ,那么将返回这个 promise
  • 参数不是具有then()方法的对象,或根本就不是对象,Promise.resolve()会返回一个新的 Promise 对象,状态为resolved
  • 没有参数时,直接返回一个resolved状态的 Promise 对象

reject()方法

Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected

const p = Promise.reject('出错了')等同于
const p = new Promise((resolve, reject) => reject('出错了'))
p.then(null, function (s) {console.log(s)})
//出错了Promise.reject()方法的参数,会原封不动地变成后续方法的参数

any()方法

接收一个Promise可迭代对象,只要其中的一个 promise 成功,就返回那个已经成功的 promise 。如果可迭代对象中没有一个 promise 成功(即所有的 promises 都失败/拒绝),就返回一个失败的 promiseAggregateError类型的实例,它是 Error 的一个子类,用于把单一的错误集合在一起。本质上,这个方法和Promise.all()是相反的。

const pErr = new Promise((resolve, reject) => {reject("总是失败");
});const pSlow = new Promise((resolve, reject) => {setTimeout(resolve, 500, "最终完成");
});const pFast = new Promise((resolve, reject) => {setTimeout(resolve, 100, "很快完成");
});Promise.any([pErr, pSlow, pFast]).then((value) => {console.log(value);// pFast fulfils first
})

All()方法

  1. 方法接收一个promise的iterable类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个Promise实例

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

    实例p的状态由p1,p2,p3决定,分两种情况:

    1. 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数
    2. 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数

allSettled方法

Promise.all 会在任何一个请求失败的时候进入失败状态

由于单一 Promise 进入 rejected 状态便会立即让 Promise.all() 的结果进入 rejected 状态,以至于通过 Promise.all() 进入 rejected 状态时,其中的源 Promise 仍然可能处于 pending 状态,以至于无法获得所有 Promise 完成的时机。

Promise.allSettled() 静态方法会等待所有源 Promise 进入 fulfilled 或者 rejected 状态,从而确保不会造成时序上的冲突。

race方法

该方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例

const p = Promise.race([p1, p2, p3]);
  1. 只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变
  2. 率先改变的 Promise 实例的返回值则传递给p的回调函数

语法糖Async/Await

在ES8中新增了Promise的语法糖async await来更优雅的处理异步。

async 可以单独存在, 用该关键字声明的函数返回的是一个 Promise 对象。

async funtion add(){return 1
}
add()
add() instanceof Promise // true

await 不可以单独存在,必须要配合 async 一起存在使用

function sub() {await 1
}
// 这个方法定义就不满足语法的,会如下报错
// Uncaught SyntaxError: await is only valid in async function

async await 让异步处理更优雅

let fs = require('fs')var  gen = async function() {const f1= await readFile('files/a.txt');//封装一个promise对象console.log(f1)const f2=  await readFile('files/b.txt');console.log(f2)const f3=  await readFile('files/c.txt');console.log(f3)};var readFile=function(path){return  new Promise((resolve,reject)=>{fs.readFile(path,'utf-8',function(err,data){if(!err){resolve(data)}else{reject(err)}});})}var obj = gen();

promise的实例方法、静态方法相关推荐

  1. 类的实例方法静态方法类方法属性方法属性

    目录: 分类 实例方法 静态方法 类方法 属性方法 属性 分类: 按照调用方式可以分为3种,实例方法.静态方法.和类方法 实例方法 实例方法只能通过实例对象调用,不能通过类进行调用.实例方法再定义时候 ...

  2. python静态方法可以被继承吗_python 类的继承 实例方法.静态方法.类方法的代码解析...

    这篇文章主要介绍了python 类的继承 实例方法.静态方法.类方法的代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 dt={} class ...

  3. 实例对象静态对象实例方法静态方法

    实例对象:通过构造函数创建出来,实例化的对象 静态对象:不需要创建,直接就是一个对象,方法(静态方法)直接通过这个对象名字调用. 实例方法必须通过实例对象调用 静态方法必须通过大写的对象调用 转载于: ...

  4. python 实例方法 类方法_Python实例方法 静态方法 类方法

    @staticmethod和@classmethod的区别 class 类 @staticmethod @classmethod 首先创建一个类,如果想要调用Student类中的方法get_score ...

  5. php类实例方法静态方法,PHP类中的静态方法使用实例

    在php中静态方法我们就直接在函数或变量前加一个static就可以了,使用的时候和静态变量差不多,不需要实例化,直接用::调用了,下面我来给大家举几个关于静态方法实例. PHP也不例外!所谓静态方法( ...

  6. java 静态对象数组_Java静态方法和实例方法 java中的数组作为形参传入

    原标题:Java静态方法和实例方法 java中的数组作为形参传入 Java静态方法和实例方法 java中的数组作为形参传入 Java虚拟机 启动一个Java程序的时候,会诞生一个虚拟机实例,当程序关闭 ...

  7. 类方法的实例python_Python Class 的实例方法/类方法/静态方法

    实例方法.类方法.静态方法 class MyClass(object): class_name = "MyClass" # 类属性, 三种方法都能调用 def __init__(s ...

  8. Java静态方法和实例方法 java中的数组作为形参传入

    Java静态方法和实例方法 java中的数组作为形参传入 Java虚拟机 启动一个Java程序的时候,会诞生一个虚拟机实例,当程序关闭退出时,该实例会消失. 如果一个机器上运行着三个Java程序,即有 ...

  9. java 中静态变量(类变量)与实例变量 静态方法与实例方法

    静态变量: 在类内部中,方法的外部声明的对象而且加上static; 实例变量: 在类内部中,声明不需要加static; 比如: 1 public class Demo{ 2 3 int i1=0; 4 ...

最新文章

  1. 开源sk-dist,超参数调优仅需3.4秒,sk-learn训练速度提升100倍
  2. MacOS开发必备工具brew,安装nginx反向代理,替代linux工具 apt-get和 yum...
  3. 体系文件管理解决方案
  4. Kafka 常见命令行 Version 2.1.0
  5. ubuntu下面的robo3t 使用笔记
  6. 光华科技光刻胶_【收藏】6天5板!21只光刻胶概念(名单)“出炉”!
  7. python获取最近N天工作日列表、节假日列表
  8. jQuery事件对象event的属性和方法
  9. PC顶级后次世代和主流次世代图像引擎技术规格表
  10. 全球最大编程问答社区 Stack Overflow 宣布裁员 15%!
  11. Screen - BOM对象
  12. 一款很好用的在线作图工具ProcessOn,推荐大家使用
  13. fun, Python http文件上传 web容器
  14. Matlab在线性代数中的应用(三):求解非齐次线性方程组
  15. windows-xp桌面图标有蓝底怎么去掉:电脑桌面图标有蓝色阴影的解决办法
  16. Artiely Vue Admin - 基于蚂蚁金服Ant Design构建的高颜值开源管理后台UI框架
  17. 计算机无法正常启动安全模式开启,解决办法:如何解决Win7计算机无法正常启动而只能进入安全模式的问题...
  18. java秒转换为年月日_java时间转化为年月日以及将秒转化为天小时分秒字符串显示总结...
  19. 软件工程 -- 程序流程图
  20. SLAM基础问题总结(1)

热门文章

  1. 视频监控RTSP 客户端
  2. Redhat镜像-RHEL-官方镜像下载大全
  3. onchange、onpropertychange、oninput和onblur
  4. 数据库连接池种类、C3P0数据库连接池、德鲁伊数据库连接池
  5. velocity源码分析:初始化之日志系统
  6. JAVA中String、StringBuffer和StringBuider类
  7. 计算机网络实验六 综合设计实验
  8. 中荣股份上市首日破发:市值相对蒸发约3亿元,黄焕然为实控人
  9. 【Android App】二维码的讲解及生成属于自己的二维码实战(附源码和演示 超详细必看)
  10. MySQL:HINT