### Promise的含義
`Promise`是異步編程的一種解決方案,比傳統的解決方案 - 回調函數和事件,更加合理且更加強大。ES6將其寫入標準,并原生提供`Promise`對象
所謂`Promise`,簡單來說就是一個容器,里面保存著某個未來才會結束的事件結果(通常是一個異步操作)。從語法來講,`Promise`是一個對象,從它可以獲取異步操作的消息。
`Promise`對象有以下兩個特點:
1. 對象的狀態不受外界的影響。`Promise`對象代表一個異步操作。它有3個狀態:`Pending`(進行中)、`Fulfilled`(已成功)和 `Rejected`(已失敗)。
2. 一旦狀態改變就不會再變,任何時候都可以得到這個結果。`Promise`對象的狀態改變只有兩種可能:從`Pending`變為`Fulfilled`和從`Pending`變為`Rejected`。只要這兩種情況發生,狀態就凝固了,不會再變,一直保持這個結果,這時就稱為`Resolved`(已定型)
`Promise`也有以下幾個缺點:
- 無法取消`Promise`,一旦新建就會立即執行,無法中途取消
- 如果不設置回調函數,`Promise`內部拋出的異常錯誤無法反應到外部
- 當處于`Pending`時,無法得知發展到哪一步,開始或即將結束
### 基本用法
`Promise` 對象時一個構造函數,用來生成`Promise`實例。
```js
let promise = new Promise(function (rsolve, reject) {
// ...
if (/* 異步操作成功 */) {
resolve(value)
} else {
reject(error)
}
})
```
`Promise` 構造函數接受一個函數作為參數,該函數的兩個參數分別是 `resolve` 和 `reject`。
`resolve` 函數將 `Promise` 對象的狀態從 `Pending` 變為 `Resolved`,在異步操作成功時調用,并將異步操作的結果作為參數傳遞出去。
`reject` 函數將 `Promise` 對象的狀態從 `Pending` 變為 `Rejected`,在異步操作失敗時調用,并將異步操作報出的錯誤作為參數傳遞出去。
`Promise` 實例生成以后,可以用 `then` 方法分別指定 `Resolved` 和 `Rejected` 狀態的回調函數
```js
promise.then(function (value) {
// success
}, function (error) {
// failure
})
```
下面是一個 `Promise` 對象的簡單例子:
```js
function timeout (ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, 'done')
})
}
timeout(100).then((value) => {
console.log(value)
})
```
`Promise`新建之后就會立即執行
```js
let promise = new Promise(function (resolve, reject) {
console.log('Promise')
resolve()
})
promise.then(function () {
console.log('Resolved')
})
console.log('Hi')
// Promise
// Hi
// Resolved
```
### Promise.prototype.then()
`Promise` 實例具有 `then` 方法,它定義在原型對象 `Promise.prototype` 上,它的作用是為 `Promise` 實例添加狀態改變時的回調函數。
### Promise.prototype.catch()
`Promise.prototype.catch` 方法用于指定發生錯誤時的回調函數
### Promise.all()
`Promise.all` 方法用于將多個 `Promise` 實例包裝成一個新的 `Promise` 實例
### Promise.race()
`Promise.race`方法同樣是將多個 `Promise` 實例包裝成一個新的 `Promise` 實例。