promise 对象的两个特点
- 对象的状态不受外界影响。
pending:初始状态。
fulfilled:操作成功。
rejected:操作失败。
只有异步操作的结果,可以决定当前是哪一种状态。 - 一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise 对象的状态改变,只有从初始状态变为成功状态,或者从初始状态变为失败状态。
Promise 的优缺点
- 可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数,此外,promise 对象提供了统一的接口,使得控制异步操作更加容易操作。
- 缺点:第一,无法取消promise,一旦新建它就会立即执行,无法中途取消,其次,如果不设置回调函数,promise内部抛出的错误,不会反应到外部;第三,当处于初始状态时,无法得知进展到哪一个阶段(刚刚开始还是即将完成)
创建promise
new Promise((resolve,reject)=>{
// 异步处理
// 处理结束后调用 resolve 或 reject
)
promise构造函数包含一个函数回调,这个函数带有两个参数resolve和reject两个参数在这个回调理执行一些异步操作,如果一切正常,则调用resolve,否则调用reject。
已经实例化过的promise对象可以调用promise.then()方法,传递resolve和reject方法作为回调;promise.then(onFulfilled,onReject)也可以这样子promise.then(onFulfilled).catch(onReject)
promise.all()
promise.all 方法用于将多个promise实例,包装成一个新的promise实例。
var p = Promise.all([p1,p2,p3])
Promise方法接受一个数组作为参数,p1,p2,p3都是Promise 对象的实例
(1)只有p1,p2,p3的状态都变为成功时,p的状态才会变成成功,此时p1,p2,p3的返回值组成一个数组,传递给p的回调函数。
(2)只要p1,p2,p3之中有一个被rejected,p的状态就会变成rejected,此时第一个被rejected的实例的返回值,会传递给p的回调函数。
promise.race
与promise.all相似,都是以一个Promise对象组成的数组作为参数,不同的是,只要当数组中的其中一个Promise状态变成resolved或者rejected时,就可以调用.then()方法了。
Promise.resolve 方法 和 Promise.reject 方法
将现有对象转为Promise对象,Promise.resolve()就会起到这个作用。
var p = Promise.resolve('Hello')
p.then(res=>{
console.log(res)
})
// Hello
var err = Promise.reject('出错拉!')
err.then().catch(e={
console.log(e)
})
// 出错拉!