Promise的几个扩展API总结
栏目: JavaScript · 发布时间: 6年前
内容简介:和 Promise.all 相反,当所有的promise被拒绝之后,none方法执行完成的决议,如果存在一个promise执行完成的决议,none方法则执行拒绝忽略被拒绝的promise,只需要有一个完成的promise,any方法就执行完成操作,如果全部的promise都被拒绝,any方法执行拒绝操作类似race,但是只要有一个promise决议为完成(忽略前边被拒绝的promise),就忽略后边的promise
Promise的几个扩展API总结
1. Promise.none
描述:
和 Promise.all 相反,当所有的promise被拒绝之后,none方法执行完成的决议,如果存在一个promise执行完成的决议,none方法则执行拒绝
code:
Promise.none = function(promises) {
return Promise.all(promises.map(promise => {
return new Promise((resolve, reject) => {
// Promise.all里边的所有promise实例反过来就好了
return Promise.resolve(promise).then(reject, resolve)
})
}))
}
const promisesForNoneTest1= [
Promise.reject('1'),
Promise.reject('2'),
Promise.resolve('3'),
Promise.reject('4'),
]
Promise.none(promisesForNoneTest1).then(res => {
debugger
}, res => {
debugger // 执行到此
})
const promisesForNoneTest2= [
Promise.reject('1'),
Promise.reject('2'),
Promise.reject('3'),
Promise.reject('4'),
]
Promise.none(promisesForNoneTest2).then(res => {
debugger // 执行到此
}, res => {
debugger
})
2. Promise.any
描述:
忽略被拒绝的promise,只需要有一个完成的promise,any方法就执行完成操作,如果全部的promise都被拒绝,any方法执行拒绝操作
code:
Promise.any = function(promises) {
const result = []
return Promise.all(promises.map(promise => {
// 控制Promise.all处理的所有的promise都执行reslove决议
return Promise.resolve(promise).then(res => {
// 但是只记录实际上决议为resolve的结果值
result.push(res)
}, () => {
// 防止穿透,这里可以进行拒绝信息的返回
})
})).then(() => {
return new Promise((resolve, reject) => {
if (result.length > 0) resolve(result)
else reject(result)
})
})
}
const promisesForAnyTest1= [
Promise.reject('1'),
Promise.resolve('2'),
Promise.reject('3'),
Promise.resolve('4'),
Promise.resolve('5'),
]
Promise.any(promisesForAnyTest1).then(res => {
debugger // 执行到此,res 为 ['2', '4', '5']
}, res => {
debugger
})
const promisesForAnyTest2= [
Promise.reject('1'),
Promise.reject('2'),
Promise.reject('3'),
Promise.reject('4'),
Promise.reject('5'),
]
Promise.any(promisesForAnyTest2).then(res => {
debugger
}, res => {
debugger // 执行到此
})
3. Promise.first
描述:
类似race,但是只要有一个promise决议为完成(忽略前边被拒绝的promise),就忽略后边的promise
code:
Promise.first = function(promises) {
return new Promise((resolve, reject) => {
let rejectNum = 0
promises.forEach(promise => {
// 如果当前 promise 决议为reslove,那就直接执行"根promise"的resolve
// 否则去记录到拒绝的promise中,然后判断全部的promise拒绝了,执行"根promise"的reject
Promise.resolve(promise).then(resolve, () => {
if (++rejectNum === promises.length) {
// 这里可以控制reject返回的信息
reject()
}
})
})
})
}
const promisesForFirstTest1= [
Promise.reject('1'),
Promise.resolve('2'),
Promise.reject('3'),
Promise.resolve('4'),
]
Promise.first(promisesForFirstTest1).then(res => {
debugger // 执行到此,res 为 '2'
}, res => {
debugger
})
const promisesForFirstTest2= [
Promise.reject('1'),
Promise.resolve('2'),
Promise.reject('3'),
Promise.resolve('4'),
]
Promise.first(promisesForFirstTest2).then(res => {
debugger
}, res => {
debugger // 执行到此
})
4. Promise.map
描述:
在第二个方法 any 中,用到了Promise.all的方法,里边使用Array.prototype.map方法处理了所有的的promise,当前这个Promise.map方法则希望把他俩弄到一起
Promise.map方法希望实现一个处理批量异步操作的并行迭代方法,本质上是利用Promise.all进行二次封装
code:
Promise.map = function(promises, resolveCallback, rejectCallback) {
return Promise.all(promises.map(promise => {
return Promise.resolve(promise).then(result => {
return resolveCallback(result)
}, error => {
return Promise.reject(rejectCallback(error))
})
}))
}
const promisesForMapTest1= [
Promise.resolve('1'),
Promise.resolve('2'),
Promise.resolve('3'),
Promise.resolve('4'),
]
Promise.map(promisesForMapTest1, result => {
return result * 100
}, result => {
return result
}).then(res => {
debugger // 执行到此,res为 [100, 200, 300, 400]
}, res => {
debugger
})
const promisesForMapTest2= [
Promise.resolve('1'),
Promise.resolve('2'),
Promise.reject('3'),
Promise.resolve('4'),
]
Promise.map(promisesForMapTest2, result => {
return result * 100
}, result => {
return result
}).then(res => {
debugger
}, res => {
debugger // 执行到此,res为 "3"
})
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- iOS 分类扩展与协议总结
- MySQL索引扩展(Index Extensions)学习总结
- 对象的扩展 —— ES6基础总结(五)
- 字符串的扩展 —— ES6基础总结(四)
- SQL Server扩展事件system_health会话总结
- Springboot启动扩展点超详细总结,再也不怕面试官问了
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
技术元素
[美] 凯文·凯利 / 张行舟、余倩、周峰、管策、金鑫、曾丹阳、李远、袁璐 / 译言·东西文库/电子工业出版社 / 2012-5 / 55.00元
我会将我不成熟的想法、笔记、内心争论、草稿以及对其他文章的回应都写在《技术元素》中,这样我就能知道自己到底在想些什么。——KK “技术元素”(technium)是凯文•凯利专门创造出来的词语。“技术元素不仅仅包括一些具象的技术(例如汽车、雷达和计算机等),它还包括文化、 法律、社会机构和所有的智能创造物。”简而言之,技术元素就是从人的意识中涌现出来的一切。KK把这种科技的延伸面看成一个能产生......一起来看看 《技术元素》 这本书的介绍吧!
正则表达式在线测试
正则表达式在线测试
RGB HSV 转换
RGB HSV 互转工具