1、什么是Promise

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。

这么说可能不够直观的理解,看下面的两个例子

    // callback回调函数
function getCallback(n,callback) {
setTimeout(() => {
var num = 2*n
console.log('num',num)
callback(num) },2000)
}
getCallback(3,function callback(n) {
console.log('n',n)
}) // Promise函数的基础用法(等同于上面的回调函数)
function runPro(n){
let p = new Promise((resolve,reject) => {
setTimeout(() => {
var num = 2*n
console.log('num',num)
resolve(num)
},2000)
})
return p
}
runPro(3).then((res) => {
console.log('res',res)
})

这么看是不是觉得Promise并没有什么特别的,而且还要费劲封装,有这功夫用回调函数就好了,那么在看下面的例子

    // 三层callback回调函数(传说的回调地狱)
function getCallback0(n,callback1) {
setTimeout(() => {
var num0 = 2*n
console.log('num0',num0)
callback1(num0,function callback2(params,callback3) {
let num2 = params + 1
console.log('num2',num2)
callback3(num2)
})
},2000)
} getCallback0(3,function callback1(n,callback2) {
let num1 = n+1
console.log('num1',num1)
callback2(num1,function callback3(params) {
let num3 = params + 1
console.log('num3',num3)
}
)
}) // 三层Promise(等同于上面的回调函数)
function runPro0(n){
let p = new Promise((resolve,reject) => {
setTimeout(() => {
var num0 = n*2
console.log('num0',num0)
resolve(num0)
},2000)
})
return p
}
runPro0(3)
.then((res) => {
// console.log('res',res)
let Pro1 = new Promise((resolve,reject) =>{
var num1 = res+1
console.log('num1',num1)
resolve(num1)
})
return Pro1
})
.then((res) =>{
// console.log('res',res)
let Pro2 = new Promise((resolve,reject) =>{
var num2 = res+1
console.log('num2',num2)
resolve(num2)
})
return Pro2 })
.then((res) =>{
var num3 = res+1
console.log('num3',num3)
        // 如果需要可以继续回调
})

通过上面的对比可以很清除的看出,用Promise处理异步事件更加简洁直观

2、基础用法

     const p = new Promise(function(resolve,reject){
if(success){
resolve('成功的结果')
}else{
reject('失败的结果')
}
})
p.then(function (res) {
// 接收resolve传来的数据,做些什么 },function (err) {
// 接收reject传来的数据,做些什么
})
p.catch(function (err) {
// 接收reject传来的数据或者捕捉到then()中的运行报错时,做些什么
})
     p.finally(function(){
      // 不管什么状态都执行
     })
    

3、Promise的相关方法

     Promise.prototype.then()
Promise.prototype.catch()
Promise.prototype.finally()
Promise.resolve()
Promise.reject()
Promise.all()
Promise.race()

由代码可以看出.then() .catch() .finally()都是定义在原型对象上的

4、then 的用法

由上面的基础用法代码可以看出.then()接收两个参数,第一个是resolved状态的回调函数,第二个是rejected状态的回调函数

5、catch的用法
.catch方法是.then(null, rejection)的别名,用于指定发生错误时的回调函数。
 
6、finally的用法
.finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。
 
7、all的用法
Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调,all接收一个数组参数,里面的值最终都算返回Promise对象。这样,三个异步操作的并行执行的,等到它们都执行完后才会进到then里面。那么,三个异步操作返回的数据哪里去了呢?都在then里面呢,all会把所有异步操作的结果放进一个数组中传给then。
(1)只有getNumber1、getNumber2、getNumber3的状态都变成fulfilled,Promise的状态才会变成fulfilled,此时getNumber1、getNumber2、getNumber3的返回值组成一个数组,传递给Promise的回调函数。
(2)只要getNumber1、getNumber2、getNumber3之中有一个被rejected,Promise的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给Promise的回调函数。
     function getNumber1(){
var p = new Promise(function(resolve, reject){
setTimeout(function(){
console.log('1')
resolve('随便什么数据1');
}, 1000);
});
return p;
}
function getNumber2(){
var p = new Promise(function(resolve, reject){
setTimeout(function(){
console.log('2')
reject('随便什么数据2');
}, 2000);
});
return p;
}
function getNumber3(){
var p = new Promise(function(resolve, reject){
setTimeout(function(){
console.log('3')
reject('随便什么数据3');
}, 3000);
});
return p;
}
Promise.all([getNumber1(),getNumber2(),getNumber3()])
.then(function(res){
console.log('res',res)
console.log('res',res[2].data)
},function (err){
console.log('err',err)
})
.catch(function(err2){
console.log('err2',err2) })
8、race的用法
Promise.race方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。
不过只要getNumber1、getNumber2、getNumber3之中有一个实例率先改变状态,Promise的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给Promise的回调函数。
 

注意:

1、Promise定义后就执行,所以通常用函数进行分装

2、Promise.all()中的参数是以一个数组传入的

ES6 Promise使用介绍的更多相关文章

  1. es6 Promise简单介绍

    promise的基本用法 promise执行多步操作非常好用,那我们就来模仿一个多步操作的过程,那就以吃饭为例吧.要想在家吃顿饭,是要经过三个步骤的. 洗菜做饭. 坐下来吃饭. 收拾桌子洗碗. 这个过 ...

  2. 解析ES6 Promise

    ES6 Promise 概念之类的,大概读者都应该有所知道,接下来我们直入终点. 先让我们来看看什么是Promise吧,他是一个object,类,arry,function? 首先,学习它的时候应该讲 ...

  3. 通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise

    Deferred 和 Promise ES6 和 jQuery 都有 Deffered 和 Promise,但是略有不同.不过它们的作用可以简单的用两句话来描述 Deffered 触发 resolve ...

  4. ES6 Promise 接口

    构造函数 new Promise(function(resolve, reject){}); 构造函数接受一个函数(executor)作为参数,该函数在返回 Promise 实例之前被调用.函数的两个 ...

  5. Es6 Promise 用法详解

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

  6. ES6 Promise 全面总结

    转载:点击查看原文 ES6 Promise对象 ES6中,新增了Promise对象,它主要用于处理异步回调代码,让代码不至于陷入回调嵌套的死路中. @-v-@ 1. Promise本质 Promise ...

  7. ES6 Promise 异步操作

    最近越来越喜欢与大家进行资源分享了,并且及时的同步到自己的园子内,为什么呢? 一.小插曲(气氛搞起) 在上个月末,由于领导的高度重视(haha,这个高度是有多高呢,185就好了),走进了公司骨干员工的 ...

  8. 微信小程序Http高级封装 es6 promise

    公司突然要开放微信小程序,持续蒙蔽的我还不知道小程序是个什么玩意. 于是上网查了一下,就开始着手开发..... 首先开发客户端的东西,都有个共同点,那就是  数据请求! 看了下小程序的请求方式大概和a ...

  9. jquery Promise和ES6 Promise的区别

    1. Deferred对象有resolve和reject方法,可以直接修改状态 jquery用Deferred实现了Promise规范,Deferred与ES6 Promise的最大区别是: Defe ...

随机推荐

  1. MVC与MTV模型及Django请求的生命周期

    MVC模型 MVC:Model View Controller M: 模型.是应用程序中用于处理应用程序数据逻辑的部分 V:视图.是应用程序汇总处理数据显示的部分 C:控制器.是应用程序中处理用户交互 ...

  2. c++ split(getline实现)

    众所周知 c++中string没有自带的split函数(亏你还是老大哥) 网上关于split函数的优秀写法很多 本人不再赘述 今几日翻C++API时发现了getline一个有趣的方法 istream& ...

  3. HDU 4292 Food (建图思维 + 最大流)

    (点击此处查看原题) 题目分析 题意:某个餐馆出售f种食物,d种饮料,其中,第i种食物有fi份,第i种饮料有di份:此时有n个人来餐馆吃饭,这n个人必须有一份食物和一份饮料才会留下来吃饭,否则,他将离 ...

  4. python网络编程-socket套接字通信循环-粘包问题-struct模块-02

    前置知识 不同计算机程序之间数据的传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...

  5. 使用Python基于百度等OCR API的文字识别

    百度OCR Baidu OCR API:一定额度免费,目前是每日500次 Python SDK文档:https://cloud.baidu.com/doc/OCR/OCR-Python-SDK.htm ...

  6. 安装Python环境

    首先我们来安装Python,Python3.5+以上即可 1.首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进入之后如下图,选择图 ...

  7. cSpring Boot整合RabbitMQ详细教程

    来自:https://blog.csdn.net/qq_38455201/article/details/80308771 十分详细,几张图片不显示,看这个地址 1.首先我们简单了解一下消息中间件的应 ...

  8. Linux-1.2关机重启reboot,shutdown

    关机重启:reboot,shutdown reboot 重启操作系统 shutdown -r now 重启,shutdown会给其他用户提示

  9. windows下搭建spark+python 开发环境

    有时候我们会在windows 下开发spark程序,测试程序运行情况,再部署到真实服务器中运行. 那么本文介绍如何在windows 环境中搭建简单的基于hadoop 的spark 环境. 我的wind ...

  10. jQuery 遍历 - 祖先

    通过 jQuery,您能够向上遍历 DOM 树,以查找元素的祖先. 向上遍历 DOM 树 这些 jQuery 方法很有用,它们用于向上遍历 DOM 树: parent() parents() pare ...