从我理解来说,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('出错了'))