背景:在一个方法中处理一个复杂的异步操做时会涉及到多个异步处理,它们多是层层嵌套致使这个方法异常的庞大,影响往后的代码维护和问题的查找promise
解决:在ES6中提供了一个Promise的对象,它以一种链式的写法将异步操做逻辑与异步返回结果的处理逻辑分离,让代码更加有可读性异步
原理:promise提供了三种状态,经过状态与then函数中指定的处理函数关联,当promise处于fullfilled状态的时候就会调用对应处理成功的函数,处于rejected状态的时候就会调用then提供的失败的处理函数函数
相关知识spa
语法:new Promise( function(resolve, reject) {...} /* executor */ );
prototype
Promise中提供了一个暂时称为executor的匿名回调函数,在建立Promise对象的时候会当即调用这个回调方法并传递两个由Promise提供的接口函数resolve和reject。那么何时去调用这两个函数呢? 从语义上来理解来讲resolve表示异步操做成功时的处理而reject表示异步操做失败时的处理。在这个匿名函数中咱们只须要编写异步执行的代码逻辑而具体的异步返回的处理放到别处,这时候resolve和reject更像是两个占位符,调用他们分别在执行成功的地方用resolve占一个位置,在失败的地方用reject占一个位置,promise会根据各自的状态执行各自所关联的结果处理函数
状态:code
pending: 初始状态,既不是成功,也不是失败状态。 fulfilled: 意味着操做成功完成。 rejected: 意味着操做失败。
当调用resolve方法的时候会设置一个fulfilled状态,调用rejected方法的时候会设置一个rejected状态。只要promise处于这两种状态的一种它就会调用经过then方法添加相应处理函数,若是是pending状态你须要先设置另外两种中的一种才会调用对应then方法中的处理函数
链式:图中所示的方法都会建立一个新的promise对象以达到链式调用的目的对象
原型方法blog
then方法:Promise.prototype.then(onFulfilled, onRejected)
接口
这个then方法颇有意思,它提供上面所说的异步返回结果的处理逻辑,它会将处理逻辑与promise对象的状态关联。从上面看有两个on前缀的变量,它们能够是函数也能够是字符串。若是是字符串它会将上个链传递的状态和值传递到下一个链;若是onFulfilled/onRejected)是函数,那么函数返回值能够是一个本身建立的promise对象也能够是一个字符串还能够是没有返回值,then方法会对这些返回值作解析并返回一个新的promise(返回字符串和什么都不返回的状况,then新建的promise对象的状态是fulfilled。返回是自定义的promise,状态由本身设但不能不给状态,否则不会执行下一个链)
详细文档
Promise文档图片