背景
项目前端js需要实现向多个ip地址请求某个接口,一但有某个接口成功就返回其结果,全部失败才为失败。
方法
一开始就想到Promise的all和race,但是都不满足,所以就自己封装了一个。(后面发现其实有Promise.any这个方法,但是可能会有兼容性问题,
Promise.any())
代码
参考了网上的Promise.all的实现方法,来实现Promise.any
Promise.all实现方式
const all = function(promises) {
return new Promise((resolve, reject) => {
let arr = []
let idx = 0 // 执行个数
let dealProcess = (val, index) => {
arr[index] = val
if(++idx == promises.length) {
resolve(arr)
}
}
promises.forEach((item, i) => {
if(isPromise(item)) {
item.then(y => {
dealProcess(y, i)
},
reject)
}else {
dealProcess(item, i)
}
});
})
}
自己封装实现any
const any = function(promises) {
return new Promise((resolve, reject) => {
let arr = []
let idx = 0 // 执行个数
let dealProcess = (val, index) => {
arr[index] = val
if(++idx == promises.length) {
reject(arr)
}
}
promises.forEach((item, i) => {
if(isPromise(item)) {
item.then(resolve,y => {
dealProcess(y, i)
})
}else {
dealProcess(item, i)
}
});
})
}
测试代码
const prFull = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('FULFIL')
}, 1000)
})
const prFull2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('FULFIL2')
}, 100)
})
const prFull3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('FULFIL3')
}, 1000)
})
const prFull4 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('FULFIL4')
}, 1000)
})
const prRej = new Promise((resolve, reject) => {
setTimeout(() => {
reject('rejuect11')
}, 1000)
})
const prRej2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('rejuect')
}, 1000)
})
all([prFull3,prFull2,prRej]).then(value =>{console.log(value)
},err =>{console.log(err)})
any([prRej,prRej2]).then(value =>{console.log(value)
},err =>{console.log(err)})