@NOTE 阅读完你不知道的JS---Promise后 重新整理Promise使用方式
new Promise(...)构造器
构造函数接受两个函数回调用来支持Promise的决议:
通常这两个函数命名为resolve(..)和reject(..)
new Promise((resolve,reject)=>{
// resolve(..)用于完成这个promise
// reject(..)用于拒绝这个promise
})
···
**注意:**
- reject(..)调用就是用于拒绝这个promise,不管传入参数是什么
- resolve(..)调用既可能完成promise,也可能拒绝,根据传入参数而定
- 非thenable、非Promise的立即值 => 使用这个值完成
- Promise或thenable值 => 被递归展开,promise将使用其最终决议值或状态
## Promise.resolve(..) 与 Promise.reject(..)
Promise.reject(..) 用来创建一个已被拒绝的Promise,以下两个Promise是等价的:
var p1 = new Promise( function(resolve, reject){
reject( "Opps" );
})
var p2 = Promise.reject( "Opps" );
Promise.resolve(..)用于创建一个已完成的Promise,但与reject不同的是,resolve会尝试展开thenable值,在这种情况下最终返回的Promise采用传入thenable的最终决议值,可能是完成也可能是拒绝
对于传入一个真正的Promise,Promise.resolve(..)其实就是返回这个Promise本身,所以有个小tip:*对不了解属性的值调用Promise.resolve(..)可以规范其返回,保证一定是一个Promise,并且如果该值恰好是一个真正的Promise,也不会有其他开销*
## Promise.prototype.then(..)和Promise.prototype.catch(..)
Promise实例上的方法,为这个Promise注册完成和拒绝处理函数
Promise决议之后:
- 立即会调用这两个处理函数之一
- 不会两个都调用
- 总是**异步**调用
then(..)
- 接受一个或者两个参数:第一个用于完成回调,第二个用于拒绝回调
@TODO 对比拒绝回调与 then(..).catch(..) 获取错误的范围
## 常用Method
### Promise.all(iterable)
iterable:可迭代的对象,Array或String
在iterable参数中所有Promise按顺序resolve(或没有Promise对象)后返回一个Promise,当iterable中有返回reject时返回该reject
可用于多个有顺序依赖的异步操作,例子(from MDN):
var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([p1, p2, p3]).then(values => {
console.log(values); // [3, 1337, "foo"]
});
### Promise.race(iterable)
iterable:可迭代的对象,Array或String
iterable中任意Promise resolve或reject后返回该Promise的结果,参考命名race(竞态)
不包含任何Promise对象的iterable参数将会导致返回永远pending
@TODO Promise常用开发模式栗子