## 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`方法指定的回调函数。