**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对象形式使用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。