ECMAscript 6 原生提供了 Promise 对象。
Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息。
一 . 首先介绍promise的两个特点:
1.promise的状态不受外界影响。Promise对象代表一个异步操作,它的三种状态也是非常重要的:
① pending: 初始状态,不是成功或失败状态。
② fulfilled: 意味着操作成功完成。
③ rejected: 意味着操作失败。
2.且只有异步操作的结果,可以决定当前是哪一种状态,任何其他的操作都无法改变这个状态。一旦状态改变,就不会在变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:
① 从 Pending 变为 Resolved
② 从 Pending 变为 Rejected。
只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对 Promise 对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
二. Promise 优缺点
优点:有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise 对象提供统一的接口,使得控制异步操作更加容易。
缺点:Promise 也有一些缺点。首先,无法取消 Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。第三,当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
三. Promise 创建
要想创建一个promise对象,可以使用new来调用promise的构造器来进行实例化。
var promise = new Promise(function(resolve,reject){ // 异步处理 // 处理结束后,调用resolve或者reject })
Promise构造函数包含一个参数和一个带有resolve(解析)和reject(拒绝)两个参数的回调。再回调中执行一些操作(例如异步),如果一切正常,则调用resolve(解析),否则调用reject(拒绝)。
var myFirstPsomise = new Promise(function(resolve,reject){ // 当异步代码执行成功时,我们才会调用resolve(...),当异步代码失败时就会调用reject(...) // 在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法 setTimeout(function(){ resolve('成功') // 代码正常执行 },500) }) myFirstPsomise.then(function(successMessage){ // successMessage的值是上面调用resolve(...)方法传入的值 // successMessage参数不一定非要是字符串类型。 document.write("打印到界面上的" + successMessage) })
对于已经实例化过得promise对象可以调用promise.then方法,传递resolve和reject方法作为回调。
promise.then() 是 promise 最为常用的方法。
promise.then(onFulfilled, onRejected)
promise简化了对error的处理,上面的代码我们也可以这样写:
promise.then(onFulfilled).catch(onRejected)