es6基础回顾--Promise

来源:互联网 发布:经典小说推荐 知乎 编辑:程序博客网 时间:2024/06/14 03:24

从我理解来说,Promise解决回调地狱,不会在ajax里面无休止的调用ajax了。
Promise是一个对象,从其中可以获取异步操作的消息。
Promise对象的状态不受外界影响,其代表一个异步操作,有三种状态:Pending(进行中),Resolved(已完成),Rejected(已失败)。一旦状态改变就不会再变。

生成Promise实例对象基本用法:

    var promise = new Promise(function(resolve,reject){        if(/*异步操作成功*/){  //比如ajax操作            resolve(value)        }else{            reject(error)        }    })

resolve函数的作用是将Promise对象的状态从Pending变为Resolved,在异步操作成功时调用,并将异步操作的结果作为参数传递出去。
reject函数的作用是将Promise对象的状态从Pending变为Rejected,在异步操作失败时调用,并将异步操作的报错作为参数传递出去。

Promise实例生成后就可以用then方法,接受两个参数,分别指定Resolved状态和Reject状态的回调函数。第二个函数可选。

    function test() {        return new Promise((resolve,reject)=>{            $.ajax({                url:xxx,                context:xxx,                success:function(value){                    resolve(value) //成功时用resolve                },                error:function(mes){                    reject(mes)   //失败时用reject                }            })        })    }    test.then((value)=>{        console.log(value); //接受resolve返回的数据    },(mes)=>{        console.log(mes);  //接受reject返回的数据    })

Promise.prototype.then()

then方法返回的是一个新的Promise实例。因此可以采用链式写法,then方法后再调用另一个then方法。

    test.then(()=>{        return xxx;     }).then(()=>{        //...       })

Promise.prototype.catch()

catch方法是then(null,rejection)的别名,用于指定发生错误时的回调函数。

test.then(()={    //...   }).catch(function(){    //处理 getJSON 和 前一个回调函数运行时发生的错误  })

如果异步操作抛出错误,状态会变为Rejected,会调用catch方法指定的回调函数处理这个错误。catch返回的还是一个Promise对象,后面还可以接着调用then方法。

Promise.all()

用于将多个Promise实例包装成一个新的Promise实例。

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

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

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

Promise.race()

同样也是讲多个Promise实例包装成一个新的Promise实例。

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

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

Promise.resolve()

将现有对象转换成Promise对象。

var jsPromise = Promise.resolve($.ajax('/whatever.json'));

Promise.reject()

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

var p = Promise.reject('出错了');// 等同于var p = new Promise((resolve, reject) => reject('出错了'))
0 0
原创粉丝点击