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. [python] 在指定目录下找文件

    import os # 查找当前目录下所有包含关键字的文件 def findFile(path, filekw): return[os.path.join(path,x) for x in os.li ...

  2. Replace Words

    In English, we have a concept called root, which can be followed by some other words to form another ...

  3. Linx

    1. 2. 2. 3. 5. Vi 猜数字 第二十个裴伯拉数字 1 1 2 3 5 8 2 3 求小于3000的裴伯拉数列 4 5 递归方式1到100 和 6 7 100 以内奇数.偶数和 8 Sss ...

  4. Coins —— POJ-1742

    Time limit 3000 ms Memory limit 30000 kB Description People in Silverland use coins.They have coins ...

  5. # 解决MongoDB突然无法连接的问题

    解决MongoDB突然无法连接的问题 使用命令,加上路径sudo mongod --dbpath=/var/lib/mongodb 这种情况一般是上一次使用的时候没有正常关闭数据库,正常启动:mong ...

  6. IDEA2018.2.6激活(可用)

    破解插件下载: 链接:https://pan.baidu.com/s/1j2_kEm_Akcph6Qb8hr6soQ 提取码:hv64 将下载包放入bin文件夹下,修改bin中的两个文件 idea.e ...

  7. Java排序--排序算法(内排序)

    常用内排序算法 我们通常所说的排序算法往往指的是内部排序算法,即需要排序的数据在计算机内存中完成整个排序的过程,当数据率超大或排序较为繁琐时常借助于计算机的硬盘对大数据进行排序工作,称之为外部排序算法 ...

  8. C# 面向对象2 (类的语法)

    1.类 语法: [public] class 类名 { 字段; 属性; 方法; } **类名首字母必须大写 2.创建对象 创建这个类的对象过程称之为类的实例化,关键字:new this:表示当前这个类 ...

  9. 冒泡排序(java可直接跑,算法思想等小儿科不多说直接上代码)

    import java.util.Arrays; /** *冒泡排序:时间复杂度O(N^2),空间复杂度O(1),稳定的排序 * 每趟确定一个元素的位置,所以需要arr.length趟排序, */pu ...

  10. 第二十篇 jQuery 初步学习2

    jQuery 初步学习2   前言:   老师这里啰嗦一下,因为考虑到一些同学,不太了解WEB前端这门语言.老师就简单的说一下,写前端,需要什么:一台笔记本.一个文本编辑器.就没啦!当然,写这门语言, ...