Promise 对象
所谓promise, 简单来说是一个容器, 里面保存着某个未来才会结束的事件
有 3 种状态 Pending 进行中, Fulfilled 已成功, Rejected 已失败
ES6规定, Promise对象是一个构造函数, 用来生成Promise实例.
function test(){
let value = "hello world";
var promise = new Promise(
function(resolve,reject){
if(true){
resolve(value)
}else{
reject(value)
}
}
);
}
test();
Promise 构造函数接受一个函数作为参数, 该函数的两个参数分别是resolve和reject
它们是两个函数, 由JavaScript引擎提供, 不用自己部署
resolve 函数的作用是, 将Promise对象的状态从"未完成" 改为 "成功", 即从Pending改为Resolved
在异步操作成功时调用, 并将异步操作的结果作为参数传递出去
reject 函数的作用是, 将Promise对象的状态从"未完成" 改为 "失败", 即从Pending改为Rejected
在异步操作失败时调用, 并将异步操作报出的错误作为参数传递出去
Promise 实例生成以后, 可以用then方法分别指定Resolved 状态和Rejected状态的回调函数
then 可以接受两个回调函数作为参数
第一个回调函数是Promise对象的状态变为Resolved时调用, 第二个回调函数是Promise对象的状态变为Rejected时调用.
其中第二个函数是可选的,不一定要提供
function test(){
let value = "hello world";
var promise = new Promise(
function(resolve,reject){
if(false){
resolve(value)
}else{
reject("error message")
}
}
);
promise.then((value)=>{
console.log(value)
},(error)=>{
console.log(error)
})
}
test();

Promise实例的状态变为Resolved之后, 就会触发then方法绑定的回调函数
如果调用resolve函数和reject函数时带有参数, 那么这些参数会被传递给回调函数, reject函数的参数通常是error对象的实例, 表示抛出错误;
Promise.all()
Promise.all 方法用于将多个Promise实例包装成一个新的Promise实例
var p = Promise.all()
Promise.all 方法接受一个数组作为参数, p1, p2, p3 都是Promise对象的实例, 如果不是则会先调用Promise.resolve方法, 将参数转化为Promise实例再进一步处理
Promise.all 方法的参数不一定是数组, 但是必须有Iterator接口, 且返回的每个成员都是Promise 实例
p的状态由p1, p2, p3 决定, 分为两种情况
1. 只有p1, p2, p3的状态都变成 Fulfilled, p 的状态才会变成Fulfilled, 此时 p1, p2, p3 的返回值组成一个数组, 传递给p的回调函数
2. 只要p1, p2, p3中有一个被Rejected, p 的状态就会变成Rejected, 此时第一个被Rejected的实例的返回值会传递给p的回调函数
Promise.race()
Promise.race 方法同样是将多个Promise实例包装成一个新的Promise实例
var p = Promise.race( [ p1, p2, p3 ] )
只要p1, p2, p3 中有一个实例率先改变状态, p 的状态就跟着改变, 那个率先改变的Promise实例的返回值就传给p的回调函数
使用这个方法可以定义超时
Promise.resolve()
Promise.resolve方法可以将现有对象转化为Promise对象.
var p = Promise.resolve($.ajax(‘/test.json’));
1. 参数是一个Promise实例
如果参数是Promise实例, 那么Promise.resolve 将不做任何修改, 原封不动地返回这个实例
2. 参数是一个thenable对象
thenable对象指的是具有then方法的对象
let thenable = {
then: function(resolve, reject) {
resolve(42)
}
}
Promise.resolve 方法会将这个对象转化为Promise对象, 然后立即执行thenable对象的then方法.

3. 参数不是具有then方法的对象或根本不是对象
如果参数是一个原始值, 或者是一个不具有then方法的对象, 那么Promise.resolve方法返回一个新的Promise对象, 状态为Resolved

上面代码中生成一个新的Promise对象的实例p1.
由于字符串不属于异步操作(判断方法是字符串对象不具有then方法), 返回promise实例的状态从生成起就是Resolved, 所以回调函数会立即执行.
Promise.resolve 方法的参数会同时传给回调函数
4. 不带有任何参数
Promise.resolve 方法允许在调用时不带有参数, 而直接返回一个Resolved状态的对象.
所以如果希望得到一个Promise对象, 比较方便的方法就是直接调用Promise.resolve方法
Promise.reject()
Promise.reject(reason) 方法也会返回一个新的Promise实例, 状态为 Rejected
var p = Promise.reject(‘出错了’);