学习笔记——ES6中Promise对象详解


在ES6中有一个重要的对象Promise,可以被new使用。代表了未来将要发生的事,用来描述异步操作的结果。其函数内部往往会包括异步耗时的代码。

1.Promise的基本配置:

{              挂起      成功        失败
    status: 'pending | fulfilled | rejected', // status最多只能变化一次
    // 状态的改变只有两种可能:pending -> fulfilled, pending -> rejected
    data: undefined,    // 需要携带的数据,没有默认undefined
    success: null,      // 成功的回调函数
    failure: null,      // 失败的回调函数
    then: function(fn, fn2) {
        this.success = fn;
        this.failure = fn2;
    },
    resolve: function(data) { 获取一个成功状态的promise
        this.data = data;
        this.status = "fulfilled";
    },
    reject: function(data) { 获取一个失败状态的promise
        this.data = data;
        this.status = "rejected";
    }
}

优点:异步代码用同步流程来表示。避免地狱回调(回调函数层层嵌套)。

缺点:创建后无法取消,必须设置回调函数。

2.Promise对象的创建:

var p =  new Promise(function(resolve,reject) {
    setTimeout(function() {
        
    }, 2000);
}).then(function(data) => {})
  .catch(function(data) => {});

catch本质上是一个特殊的then函数(第一个参数是null,第二个参数是函数),Promise的then函数和catch函数总是返回一个新的promise对象。这样我们就可以连续的then,且Promise规定:上一个then参数函数的返回值会传给下一个then的参数函数当参数,如果在then里没有显示的返回一个失败的Promise或异常出现,then函数和catch函数,总是返回一个成功的Promise。

Promise.resolve(123).then(data => { console.log(data); return Promise.resolve(456) }) 
// data 123
                    .then(data => { console.log(data); return Promise.reject(789) })  
// data 456
                    .catch(data => { console.log(data); }) // data 789

 3.Promise中的方法(还没用到过):

Promise.all([p1,p2,p3])将用于多个Promise实例包装成一个新的Promise对象。参数不一定是数组

Promise.all([p1,p2,p3])的状态分为两种情况:

只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。

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

// 第一种情况,全是成功状态
var p1 = new Promise((resolve, reject) => { let data = 10; resolve(data) });
var p2 = new Promise((resolve, reject) => { let data = 100; resolve(data) });
var p =  Promise.all([ p1, p2 ]);
p.then((datas) => { console.log(datas); });    // [10, 100]

// 第二种情况, 有一个是失败状态
var p1 = new Promise((resolve, reject) => { let data = 10; resolve(data) });
var p2 = new Promise((resolve, reject) => { let data = 100; reject(data) });
var p =  Promise.all([ p1, p2 ]);
p.then((datas) => { console.log(datas); }).catch((datas) => { console.log(datas); });// 100

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

Promise.race([p1,p2,p3])中只要有一个对象状态率先改变,其状态就跟着改变。那个率先改变的Promise实例的返回值,就传递给其的返回值。

而且如果Promise.all()和Promise.race()方法的参数不是Promise对象会先调用Promise.resolve和Promise.reject方法。

var p1 = Promise.resolve('成功了');
p1.then(data => { console.log(data); }); 	// 成功了

var p1 = Promise.reject('失败了');
p1.then(null, data => { console.log(data); }); 	// 失败了

Promise对象常常用于描述异步耗时的操作。我们也会用Promise对象封装ajax和一些需要耗时的异步操作。使得代码更优雅。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一一GG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值