## Promise 快捷方式
### Promise.resolve() 和 Promise.reject()
可以使用 Promise.resolve() 和 Promise.reject() 快捷返回,比如 :
```
function p (num) {
if (num >= 0) {
return Promise.resolve(num)
} else {
return Promise.reject(new Error('參數不能小于 0'))
}
}
```
### Promise.all
JavaScript 還提供了 Promise.all,但它不是什么快捷方式。
可以如下總結它的算法:
```
接受一個 promise 的數組
等待所有這些 promise 完成
返回一個新的 Promise,將所有的 resolve 結果放進一個數組里
只要有一個 promise 失敗(rejected),這個新的 promise 將會被 rejected
```
示例,函數仍然使用上述 p() 函數
```
Promise.all([
p(10),
p(20)
]).then(console.log)
.catch(console.log)
```
輸出 `[10, 20]`
注意: `Promise.all` 是一點不笨,只要有一個 promise 被 reject 了,它就直接 reject,不會等到其他 promise 完成。
### Promise.race()
`Promise.race`方法同樣是將多個 Promise 實例,包裝成一個新的 Promise 實例。
```
const p = Promise.race([p1, p2, p3]);
```
上面代碼中,只要`p1`、`p2`、`p3`之中有一個實例率先改變狀態,`p`的狀態就跟著改變。那個率先改變的 Promise 實例的返回值,就傳遞給`p`的回調函數。
`Promise.race`方法的參數與`Promise.all`方法一樣,如果不是 Promise 實例,就會先調用下面講到的`Promise.resolve`方法,將參數轉為 Promise 實例,再進一步處理。
下面是一個例子,如果指定時間內沒有獲得結果,就將 Promise 的狀態變為`reject`,否則變為`resolve`。
```
const p = Promise.race([
fetch('/resource-that-may-take-a-while'),
new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('request timeout')), 5000)
})
]);
p
.then(console.log)
.catch(console.error);
```
上面代碼中,如果 5 秒之內`fetch`方法無法返回結果,變量`p`的狀態就會變為`rejected`,從而觸發`catch`方法指定的回調函數。