第五章:关于Promise?

什么是Promise?

Promise就是一个对象,用来传递异步操作的消息,它代表了某个未来才会知道结果的事件(通常是异步操作),并且这个事件提供统一的API,可供进一步处理。

Promise对象的两个对象

  1. 对象的状态不收外界影响,Promise对象代表了一个异步操作。有三种状态Pending(进行中)、Resolve(已完成,又称Fulfilled)和Rejected(已失败)。只有异步的操作结果可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

  2. 一旦状态改变就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变只有两种可能 :

    • 从Rending变为Resolved和从Pending变为Rrojected。只要其中之一发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生,你在对Promise对象添加回调函数,也会立即得到这个结果。
    • 这个和事件完全不同,事件的特点是,如果你错过了它,你在监听是得不到结果的。

Promise的不足之处

  • 无法取消Promise,一旦新建他就会立即执行,无法从中途取消。
  • 不过不设置回调函数,Promise内部抛出的错误不会立即反映到外部。
  • 当处于Pending状态时,无法得知目前进展到哪一个阶段。
  • 如果某些事情不断的重复发生,一般来说,使用stream模式还是部署Promise更好一点。

Promise的基本用法

创建一个Promise 的实例
1
2
3
4
5
6
7
8
9
10
11
var Promise = new Promise(function(resolve,reject){
//some code ...
})
if(/* succeed */){
resolve(value){
//some code ...
}else{
reject(error)
}
}

Promise函数接受一个函数作为参数,该函数的两个参数分别是 resolve 和 reject。

resolve和reject 函数的作用
  • resolve是将Promise对象的状态从’未完成‘变为‘成功’。在异步操作成功调用后,会将异步操作的结果作为参数传递出去
  • reject 函数在一步操作失败时调用,并将异步操作报出的错误作为参数传递出去
Promise生成后的操作

Promise实例生成后,可以用then方法分别指定Resolved传递和Rejected状态的回调函数。

1
2
3
4
5
Promise.then(function(value){
//success
},functiom(value){
//false
})

then方法可以接受两个回调函数作为的参数,第一个回调函数是Promise对象的状态变为Resolved是调用,第二个回调函数是Promise对象的状态变为Rejected时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数