**Promise** 对象是一个代理对象(代理一个值),被代理的值在Promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象

一个 Promise有以下几种状态:

  • _pending_: 初始状态,既不是成功,也不是失败状态。
  • _fulfilled_: 意味着操作成功完成。
  • _rejected_: 意味着操作失败。

pending 状态的 Promise 对象可能会变为fulfilled 状态并传递一个值给相应的状态处理方法,也可能变为失败状态(rejected)并传递失败信息。当其中任一种情况出现时,Promise 对象的then方法绑定的处理方法(handlers )就会被调用(then方法包含两个参数:onfulfilled 和 onrejected,它们都是 Function 类型。当Promise状态为_fulfilled_时,调用 then 的 onfulfilled 方法,当Promise状态为_rejected_时,调用 then 的 onrejected 方法, 所以在异步操作的完成和绑定处理方法之间不存在竞争)。

因为Promise.prototype.then和Promise.prototype.catch方法返回promise 对象, 所以它们可以被链式调用。

方法

Promise.all(iterable)
Promise.all(iterable)方法返回一个Promise实例。这个实例在iterable参数内的所有Promise对象都resolved或者参数不包含Promise时回调完成。如果参数中有一个rejected,则此实例回调失败,失败原因时第一个rejected的promise结果。

Promise.all方法常被用于处理多个promise对象的状态集合。
场景和例子:图片全部上传后,再提交Form表单,防止图片尚未上传完成,表单已提交造成图片链接地址为空

        Promise.all([this.uploadFiles('receipt')]).then(() => {
          this.auditForm.receivablesImage = JSON.stringify(this.auditForm.receivablesImage) // 拼装表单图片链接
          this.auditS() // 提交表单
        })

Promise.race(iterable)
这个实例在iterable参数内的只要有一个Promise对象状态变为解决或拒绝,返回的 promise就会解决或拒绝。
场景和例子:把异步操作和定时器放到一起,如果定时器先触发,认为超时,告知用户

let p1 = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('成功了')
    }, 2000);
})

let p2 = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('success')    
    }, 5000);
})


Promise.race([p1, p2]).then((result) => {
    console.log(result)               //['成功了', 'success']
    }).catch((error) => {
    console.log(error)
})

Promise.reject(reason)

返回一个状态为失败的Promise对象,并将给定的失败信息传递给对应的处理方法

Promise.resolve(value)

返回一个状态由给定value决定的Promise对象。如果该值是thenable(即,带有then方法的对象),返回的Promise对象的最终状态由then方法执行决定;否则的话(该value为空,基本类型或者不带then方法的对象),返回的Promise对象状态为fulfilled,并且将该value传递给对应的then方法。通常而言,如果你不知道一个值是否是Promise对象,使用Promise.resolve(value) 来返回一个Promise对象,这样就能将该value以Promise对象形式使用。


niculascoco
44 声望0 粉丝

« 上一篇
Vue 中的Mixins
下一篇 »
ES6箭头函数