Promise详细讲解,认真看完,玩转Promise!

Promise:简单说,就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。
特点:
(1)对象的状态不受外界影响。有三种状态:pending(进行中),fulfilled(已成功)和rejected(已失败)。
(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。只有两种情况:
a)Pending–>fulfilled
b)Pending–>rejected
当状态发生改变后,就可以对Promise对象添加回调函数进行下步操作了。

缺点:
(1)无法取消Promise,一旦新建它就会立即执行,无法中途取消。
(2)如果不设置回调函数,Promise内部抛出的错误不会反应到外部。
(3)当处于pending状态时,无法得知目前进行到哪一阶段(刚刚开始还是即将完成)

用法:
Promise对象是一个构造函数,用来生成promise实例。
Promise构造函数接收一个函数作为参数,该函数的两个参数分别是resolve和reject,这两个参数也是函数,由JavaScript提供,不需要自己添加。
Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。但一般不建议给then加两个参数,建议使用.then完成resolved状态的操作,使用.catch完成rejected的操作。
像这样:

const promise = new Promise( (resolve,reject) => {
resolve('ok');
reject('error')
})
promise.then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})

还可以用promise实现ajax的操作:

    const getJSON = function(url){
        const promise = new Promise((resolve,reject) => {
            const handler = function(){
                if(this.readyState !== 4){//这两个if语句主要用来判断请求是否成功
                    return;
                };
                if(this.status === 200){
                    resolve(this.response)//这是成功请求后,将返回的数据传到回调函数中
                }else{
                    reject(new Error(this.statusText))//这是失败后,将原因返给catch
                }
            };
            const xmlHttp = new XMLHttpRequest();//声明一个XMLHttpRequest对象的实例
            xmlHttp.open("get", url);//设置要发送的方法和地址
            xmlHttp.onreadystatechange = handler;//在这里调用上面定义的handler
            xmlHttp.responseType = "json";
            xmlHttp.setRequestHeader("Accept", "application/json");//设置请求头,规定接受json类型的数据
            xmlHttp.send();//真正的发送请求
        });
        return promise;
    };
    getJSON("url").then( res => {
        //成功后的操作
    }).catch(err => {
        //失败后的提示
    })

Promise可以嵌套使用,就是将一个Promise实例作为另一个Promise实例的resolve方法的参数传入。

说说then方法,这个方法是定义在Promise的原型上的,then方法返回的是一个新的Promise实例,因此可以采用链式写法,即then方法后面调用另一个then方法。

再来说几个Promise常用的api吧!

Promise.prototype.finally():
Finally方法用于不管promise对象的最后状态如何,都会执行的操作

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

Promise.resolve():
这个方法用来将参数转变成Promise对象。
有四种情况:
(1)参数是一个Promise实例:不改动
(2)参数是一个thenable对象:会将这个对象转为 Promise 对象,然后就立即执行thenable对象的then方法。
(3)参数不是具有then方法的对象,或根本就不是对象:返回一个新的Promise对象,状态为resolved
(4)不带有任何参数:直接返回一个ersolved状态的Promise对象

因此,如果希望的到一个Promise对象,这个方法不要太棒!

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

Promise.all():

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

用于将多个Promise实例,包装秤一个新的Promise实例。这个方法接收一个数组作为参数,且都是Promise实例,如果不是,就会先调用Promise.resolve方法。
注意:
只有当数组中的实例的状态都是fulfilled,p才会变成fulfilled,此时,p1,p2,p3的返回值组成一个数组,传递给p的回调函数。
只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

Promise.race():
和all方法类似,也是讲多个Promise实例包装成一个。
但不一样的是,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

在实际开发中,我们总希望让同步函数同步执行,异步函数异步执行,但如果同步函数想用Promise来做处理,能否实现同步呢?答案是肯定的。
这就要说到**Promise.try()**方法了:

const f = () => console.log('now');
Promise.try(f);
console.log('next');
// now// next

最后,如有不对,欢迎批评指正~
如果有兴趣,同学们可以从网上找一些Promise的源码看一看,很有意思,也能加深理解哦。不想找的童鞋给我留言,或私信,免费赠送!

转载请注明出处,尊重下博主的劳动成果

你可能感兴趣的:(ES6)