JavaScript的天下中,一切代码都是单线程实行的。异步实行能够用回调函数完成,然则某些场景并不好用,且不容易复用。Promise对象这类链式写法的优点在于,先一致实行逻辑,不关心怎样处置惩罚效果,然后,依据效果是胜利照样失利,在未来的某个时刻挪用success函数或fail函数。
Pomise.all的运用
Promise.all
能够将多个Promise
实例包装成一个新的Promise实例。同时,胜利和失利的返回值是差别的,胜利的时刻返回的是一个效果数组,而失利的时刻则返回最早被reject失利状况的值。
Promise.all中传入的是数组,返回的也是是数组,而且会将举行映照,传入的promise对象返回的值是根据递次在数组中分列的,然则注重的是他们实行的递次并非根据递次的,除非可迭代对象为空。
可迭代对象:
遍历Array能够采纳下标轮回,遍历Map和Set就没法运用下标。为了一致鸠合范例,ES6规范引入了新的iterable范例,Array、Map和Set都属于iterable范例。具有iterable范例的鸠合能够经由过程新的for … of轮返来遍历。
示例代码以下:
let p1 = new Promise((resolve, reject) => {
resolve('胜利了')
})
let p2 = new Promise((resolve, reject) => {
resolve('success')
})
let p3 = Promse.reject('失利')
Promise.all([p1, p2]).then((result) => {
console.log(result) //['胜利了', 'success']
}).catch((error) => {
console.log(error)
})
Promise.all([p1,p3,p2]).then((result) => {
console.log(result)
}).catch((error) => {
console.log(error) // 失利了,打出 '失利'
})
Promse.all在处置惩罚多个异步处置惩罚时异常有效,比如说一个页面上须要等两个或多个ajax的数据返来今后才一般显现,在此之前只显现loading图标。
代码模仿:
let wake = (time) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(`${time / 1000}秒后醒来`)
}, time)
})
}
let p1 = wake(3000)
let p2 = wake(2000)
Promise.all([p1, p2]).then((result) => {
console.log(result) // [ '3秒后醒来', '2秒后醒来' ]
}).catch((error) => {
console.log(error)
})
须要特别注重的是,Promise.all取得的胜利效果的数组内里的数据递次和Promise.all接收到的数组递次是一致的,即p1的效果在前,即使p1的效果猎取的比p2要晚。这带来了一个绝大的优点:在前端开辟要求数据的过程当中,偶然会碰到发送多个要求并依据要求递次猎取和运用数据的场景,运用Promise.all毫无疑问能够处理这个题目。
Promise.race的运用
望文生义,Promse.race就是竞走的意义,意义就是说,Promise.race([p1, p2, p3])内里哪一个效果取得的快,就返回谁人效果,不论效果自身是胜利状况照样失利状况。
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success')
},1000)
})
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('failed')
}, 500)
})
Promise.race([p1, p2]).then((result) => {
console.log(result)
}).catch((error) => {
console.log(error) // 翻开的是 'failed'
})