Promise
Promise是一个承诺,它根据任务是否执行成功,执行相应的后续操作,常用于异步操作中。
Promise对象用于表示一个异步操作的最终状态(完成或失败),以及其返回的值。
Promise对象状态
pending
: 初始状态,既不是成功,也不是失败状态。fulfilled
: 意味着操作成功完成。rejected
: 意味着操作失败。
Promise构造器
Promise构造器用于返回一个Promise对象
new Promise(function(resolve,reject){
if(true){
resolve("abc");
}else{
reject("def");
}
})
- 构造器参数
- 构造器参数是一个函数
- 构造器参数有两个函数参数:
resolve
,reject
- 构造器参数在调用构造器函数执行时,且在返回Promise对象之前调用
resolve
与reject
resolve
、reject
都是函数resolve
、reject
是自动传入,具体时机不明resolve
被调用时,会将即将创建的Promise对象状态设置为fulfilled
(完成),reject
被调用时,会将即将创建的promise对象状态设置为rejected
(失败)
p.then()
注:p
是一个Promise对象
p.then(onFulfilled, onRejected);
onFulfilled
与onRejected
都是函数,只不过调用时机不同- 若p的状态是
fulfilled
,会调用onFulfilled
方法,若p的状态是rejected
,会调用onRejected
方法 onFulfilled
有一个参数,即接受的最终结果,onRejected
有一个参数,即拒绝的原因
- then()的返回值
then()
返回值是一个Promise对象- 如果then中的回调函数返回一个值,那么then返回的Promise将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。
- 如果then中的回调函数抛出一个错误,那么then返回的Promise将会成为拒绝状态,并将抛出的错误作为拒绝状态的回调函数的参数值。
- 如果then中的回调函数返回一个已经是接受状态的Promise,那么then返回的Promise也会成为接受状态,并且将那个Promise的接受状态的回调函数的参数值作为该被返回的Promise的接受状态回调函数的参数值。
- 如果then中的回调函数返回一个已经是拒绝状态的Promise,那么then返回的Promise也会成为拒绝状态,并且将那个Promise的拒绝状态的回调函数的参数值作为该被返回的Promise的拒绝状态回调函数的参数值。
- 如果then中的回调函数返回一个未定状态(pending)的Promise,那么then返回Promise的状态也是未定的,并且它的终态与那个Promise的终态相同;同时,它变为终态时调用的回调函数参数与那个Promise变为终态时的回调函数的参数是相同的。
例:
// 省略其他代码...
new Promise(function (resolve, reject) {
$.ajax({
type : 'post',
data : formData,
dataType : 'json',
url : url,
success: function (data) {
if (data.code === 200){
resolve(data);
} else{
reject(data);
}
}
});
}).then(createSuccess, createFailed);
/**
* 创建成功后的处理
* @param data 创建请求的响应数据
*/
function createSuccess(data) {
console.log(data);
// do something...
layer.msg('创建成功!');
}
/**
* 创建失败后的处理
* @param data 创建请求的响应数据
*/
function createFailed(data) {
if (data.code === 400){
layer.msg(data.message);
return ;
}
if (data.code != 200) {
layer.msg('创建失败,服务器内部错误!');
return ;
}
}
使用Promise
原生的Promise不兼容低版本的IE,所以实际使用中建议使用第三方Promise库,如Bluebird。