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