Promise
是异步编程的一种解决方案javascript
Promise
实例表明一个异步操做,从它能够获取异步操做的消息html
Promise
实例有三种状态:java
Pending
:进行中es6
Resolved
:已完成编程
Rejected
:已失败json
Promise
实例的状态只能由 Pending->Resolved
, Pending->Rejected
。一旦Promise
实例的状态发生改变,就不会再发生变化,任什么时候候均可以获得这个结果数组
为何要使用Promise
:经过Promise
,能够将一步操做以同步操做的流程表达出来,能够避免层层嵌套的回调函数(回调地域),而且Promise
提供了统一的接口,使得控制异步操做更加容易promise
Promise
是一个构造函数,用来生成Promise
实例异步
var promise = new Promise(function(resolve, reject)){ // ... do something if (/*异步操做成果*/) { resolve(value) } else { /*异步操做失败*/ reject(error) } }
Promise
构造函数接受一个函数做为参数,该函数的两个参数分别是resolve
和reject
。它们是两个函数,由 JavaScript 引擎提供,不用本身部署。异步编程
resolve
函数的做用是,将Promise
实例的状态从“未完成”变为“成功”(即从 Pending
变为 Resolved
),在异步操做成功时调用,并将异步操做的结果,做为参数传递出去
reject
函数的做用是,将Promise
实例的状态从“未完成”变为“失败”(即从 Pending
变为 Rejected
),在异步操做失败时调用,并将异步操做报出的错误,做为参数传递出去**
Promise
实例生成之后,能够用then
方法分别指定Resolved
状态和Reject
状态的回调函数。
var promise = new Promise(function(resolve, reject)){ // ... do something if (/*异步操做成果*/) { resolve(value) } else { /*异步操做失败*/ reject(error) } } promise.then(function(value) { // success }, function(error) { // failure });
then
方法能够接受两个回调函数做为参数。第一个回调函数是Promise
的状态变为Resolved
时调用,第二个回调函数是Promise
实例的状态变为Rejected
时调用。其中,第二个函数是可选的,不必定要提供。
这两个函数都接受Promise
实例传出的值做为参数。(简单地说就是:上面的promise
对象在处理异步操做的过程当中,若是调用了resolve
方法,则会将resolve
的参数传递给then
方法的第一个函数,若是调用了reject
方法,这会将reject
的参数传递给then
方法的第二个函数)
then
方法返回的是一个新的Promise
实例(注意,不是原来那个Promise
实例),所以能够采用链式写法,即then
方法后面在调用另外一个then
方法
上面的代码使用then
方法,依次指定了两个回调函数。第一个回调函数完成之后,会将返回结果做为参数,传入第二个回调函数。(其实是第一个then
方法返回了一个Promise
实例,在该实例中调用了resolve
方法,而json.post
则是做为resolve
的参数)
上面代码中,第一个then
方法指定的回调函数,返回的是另外一个Promise
实例,则第一个then
方法会直接将该Promise
实例返回
该方法是.then(undefined, onRejected)
的别名,用于指定发生错误时的回调函数。
promise.then(function(data) { console.log('success'); }).catch(function(error) { console.log('error', error); });
promise对象的错误,会一直向后传递,直到被捕获。即错误总会被下一个catch所捕获。then方法指定的回调函数,若抛出错误,也会被下一个catch捕获。catch中也能抛错,则须要后面的catch来捕获。
sendRequest('test.html').then(function(data1) { //do something }).then(function (data2) { //do something }).catch(function (error) { //处理前面三个Promise产生的错误 });
该方法用于将多个Promise实例,包装成一个新的Promise实例
// p1,p2,p3都是promise实例 var p = Promise.all([p1, p2, p3]);
新的Promise实例的状态由三个promise实例共同决定
当三个promise实例的状态都变为fulfilled,p的状态才会变为fulfilled,并将三个promise返回的结果,按照参数顺序存入数组,传给p的回调函数
当p1, p2, p3其中之一状态变为rejected,p的状态也会变为rejected,并把第一个被reject的promise的返回值,传给p的回调函数
该方法用于将多个Promise实例,包装成一个新的Promise实例
// p1,p2,p3都是promise实例 var p = Promise.race([p1, p2, p3]);
新的Promise实例的状态由三个promise实例共同决定
当p1, p2, p3其中之一状态发生改变(变为fulfilled或者rejected),p的状态也会随之改变,并把第一个改变状态的promise的返回值,传给p的回调函数
Promise.resolve
方法的参数分为四种状况
参数是一个Promise实例
若是参数是Promise实例,那么Promise.resolve将不作任何修改、原封不动地返回这个实例。
参数是一个thenable对象
let thenable = { then: function(resolve, reject) { resolve(42); } }; let p1 = Promise.resolve(thenable); p1.then(function(value) { console.log(value); // 42 });
Promise.resolve方法会将这个对象转为Promise对象,而后就当即执行thenable对象的then方法。
参数不是具备then方法的对象,或根本就不是对象
若是参数是一个原始值,或者是一个不具备then方法的对象,则Promise.resolve方法返回一个新的Promise对象,状态为Resolved。
Promise.resolve('Success'); /*******等同于*******/ new Promise(function (resolve) { resolve('Success'); });
不带任何参数
直接返回一个Resolved状态的Promise对象。
Promise.resolve('Success'); /*******等同于*******/ new Promise(function (resolve) { resolve(); });
Promise.reject(new Error('error')); /*******等同于*******/ new Promise(function (resolve, reject) { reject(new Error('error')); });
这段代码会让这个Promise对象当即进入rejected状态,并将错误对象传递给then指定的onRejected回调函数。