什么是Promise?
Promise是es6提供的一种对象,这个对象包含了一系列方法。它的产生是为了解决回调地狱(可以简单理解为层层嵌套的回调函数)的尴尬。也是异步编程的一种解决方案。
Promise可以理解为一个容器,里面包含需要执行的异步操作。同时,Promise提供了统一的API,各种异步操作都可以用同样的方法进行处理。
Promise对象有以下两个特点。
- 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
- 一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。
注意:resolved统一代替fulfilled。
如何使用Promise?
示例1:
var promise=new Promise((resolve,reject)=>{
console.log('Promise');
resolve('执行完毕');
});
promise.then(res=>{
console.log(res);
},err=>{
console.log(err);
});
console.log('hello');
//'Promise'
//'hello'
//'执行完毕'
示例1很好的展示了Promise的基本使用方法,同时我们可以通过这个示例了解到Promise的执行次序。
在此之前,我们需要知道这么一个点:Promise 新建后就会立即执行。
好,看到示例1中出现了几个单词,resolve,reject和then,那么它们是什么?
- resolve和reject是两个函数,这两个函数是由 JavaScript 引擎提供,不用我们去操心,我们直接调用就行。调用方法里面可以将异步操作所得结果作为参数通过这两个函数返回给后续回调函数。
- then()是Promise对象实例的原型方法,它里面可以处理Promise对象的成功状态或者失败状态的回调结果。但是要知道,Promise对象最终只有两种结果,要么成功要么失败。两者是互相对立的。
Promise的错误处理
当我们使用Promise处理异步编程时候,出现错误该如何进行处理?
这里提供了两种解决编程过程错误处理方案:
示例2:
//方案1
new Promise((resolve,reject)=>{
$.ajax({
url:"/getUser",
type:"GET",
success:res=>{
resolve(res);
},
error:res=>{
reject(res)
}
})
}).then(resSuccess=>{
//成功的返回值
},resError=>{
//失败的返回值
})
//方案2:
new Promise((resolve,reject)=>{
$.ajax({
url:"/getUser",
type:"GET",
success:res=>{
resolve(res);
},
error:res=>{
reject(res)
}
})
}).then(resSuccess=>{
//成功的返回值
}).catch(resError=>{
//失败的返回值
})
由示例2可知两种方案的使用方式。第一种是通过then()方法中的失败回调函数处理,这里不再赘述。现在说一下第二种方式,使用catch()方法进行错误处理。
catch方法和then方法都是示例的原型对象的方法。用于指定发生错误时的回调函数,如果异步操作抛出错误,状态就会变为rejected,就会调用catch方法指定的回调函数,处理这个错误。另外,then方法指定的回调函数,如果运行中抛出错误,也会被catch方法捕获。
简单来说,catch方法捕获错误的范围比第一种方式广。
一般来说,不要在then方法里面定义 Reject 状态的回调函数(即then的第二个参数),总是使用catch方法。