JavaScript中es6新增Promise 对象

Promise 对象有以下两个特点

对象的状态不受外界影响。Promise 对象代表一个异步操作,有三种状态

  • pending: 初始状态,不是成功或失败状态。
  • fulfilled: 意味着操作成功完成。
  • rejected: 意味着操作失败。

一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise 对象的状态改变,只有两种可能:从 Pending 变为 Resolved 和从 Pending 变为 Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对 Promise 对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的

Promise 优缺点

有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise 对象提供统一的接口,使得控制异步操作更加容易。

Promise 也有一些缺点。首先,无法取消 Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。第三,当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

Promise 创建

let promiseDemo = new Promise((resolve, reject) => {
  // code
  resolve('success')
  // code 
  reject('failed') 
})

promiseDemo.then((result) => {
  console.log(result)
}, (result) => {
  console.log(result)
})

promise的最终状态会凝固,成功了以后即便再执行reject('failed')状态也不会改变。
第一种就是上面的例子
promise的then方法传参的几种方式
promiseDemo.then((result) => {
  console.log(result)
}, (result) => {
  console.log(result)
})

第二种就是把第一种方法的第二个函数拿出来做为catch,效果和第一种一样:
promiseDemo.then((result) => {
  console.log(result)
}).catch((result) => {
  console.log(result)
})

第三种,也可以只单独接收一种状态
promiseDemo.then((result) => {
  console.log(result)
})   //只接收成功状态

promiseDemo.catch((result) => {
  console.log(result)
})    // 只接收失败状态,可以看成第三种的简写形式

promiseDemo.then(null, (result) => {
  console.log(result)
})   //只接收失败状态

Promise 构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。在回调中执行一些操作(例如异步),如果一切都正常,则调用 resolve,否则调用 reject。

对于已经实例化过的 promise 对象可以调用 promise.then() 方法,传递 resolve 和 reject 方法作为回调。

promise.then() 是 promise 最为常用的方法。
promise.then(onFulfilled, onRejected)

promise简化了对error的处理,上面的代码我们也可以这样写:
promise.then(onFulfilled).catch(onRejected)

 

你可能感兴趣的:(JavaScript)