Promise对象

1>什么是Promise

Promise是异步编程的一种解决方案,它简单来说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

Promise对象有两个特点:

1)对象的结果不受外界影响:Promise对象代表有一个异步操作,有三个状态

fulfilled可以理解为成功的状态

 rejected 可以理解为失败的状态

 pending既不是成功状态也不是失败状态;可以理解为Promise对象实例创建时候的初始状态;

只有异步操作的结果才能决定当前是那一种状态,任何其他操作都无法改变这个状态

  1. 一旦状态改变,就不会再改变,任何时候都可以得到这个结果。Promise对象的状态改变只有两种可能性,从pending到fulfilled,和从pending到rejected,只要这两种情况发生,状态就会凝固,不会再改变,会一直保持这种状态。

2>我们为什么要使用Promise对象

Promise对象可以将异步操作以同步操作的流程表达出来,避免层层嵌套的回调函数,此外Promise对象提供统一的接口,使得控制异步操作更加容易

比如我们在工作中经常会碰到这么一个需求,比如我使用ajax发一个A请求后,成功后拿到数据,我们需要把数据传给B请求;

使用我们一般jq的写法代码会有以下缺点:

1)后一个请求需要依赖于前一个请求成功后,将数据往下传递,会导致多个ajax请求嵌套的情况,代码不够直观。

2)如果前后两个请求不需要传递参数的情况下,那么后一个请求也需要前一个请求成功后再执行下一步操作,这种情况下,那么也需要如上编写代码,导致代码不够直观。

针对这种情况我们可以使用Promise对象来解决

3>创建Promise

1)创建对象方法:

一.New Promise

let promise = new Promise(function(resolve, reject) {
  console.log('Promise');
  resolve();});
promise.then(function() {
  console.log('resolved.');});
console.log('Hi!');
// Promise// Hi!// resolved

对通过new 生成的promise对象为了设置其值在resolve(成功) / reject(失败) 时调用的回调函数,可以使用promise.then()实例方法。

  • Promise.resolve
Promise.resolve('foo')// 等价于
new Promise(resolve => resolve('foo'))
Promise.resolve(11).then(function(value){
    console.log(value); // 打印出11
});
  • 理解Promise.reject
const p = Promise.reject('出错了');// 等同于
const p = new Promise((resolve, reject) => reject('出错了'))

实例方法:

1)promise.then(onFulfilled, onRejected);成功和失败时都可以使用,resolve(成功) 时 调用onFulfilled 方法,reject(失败) 时 调用onRejected方法;

理解:

采用链式的then,可以指定一组按照次序调用的回调函数。它的执行过程是前一个回调函数,返回的还是一个Promise对象(即有异步操作),这时后一个回调函数,就会等待该Promise对象的状态发生变化,才会被调用。

var promise1 = new Promise(function(resolve){
    resolve(2);
});
promise1.then(function(value){
    return value * 2;
}).then(function(value){
    return value * 2;
}).then(function(value){
    console.log("1"+value);
});

打印出18,即 “1” + 2*2*2 = 18;

不管是then还是catch方法调用,都返回一个新的promise对象;

2)promise.catch(onRejected);如果出现异常的情况下可以采用这种方法,也可以写成

promise.then(undefined,onRejected)只指定onRejected回调函数即可

3)Promise.finally不管promise最后的状态是成功还是失败最后都会执行finally方法指定的回调函数。

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

4)Promise.all:将多个 Promise 实例,包装成一个新的 Promise 实例可以接受一个元素为Promise对象的数组作为参数,当这个数组里面所有的promise对象都变为resolve或者rejected时,该方法才会返回。Promise.all方法中会按照数组的原先顺序将结果返回;

var promise1 = new Promise(function(resolve){
    setTimeout(function(){
        resolve(1);
    },3000);
});
var promise2 = new Promise(function(resolve){
    setTimeout(function(){
        resolve(2);
    },1000);
});
Promise.all([promise1,promise2]).then(function(value){
    console.log(value); // 打印[1,2]
});

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

它的含义是只要有一个promise对象进入FulFilled或者Rejected状态的话,程序就会停止,且会继续后面的处理逻辑;

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

只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值