有时候需要处理一些批量操作,这样就有可能用到并发操作。
先看Promise:
处理异步并发的可以是Promise.all(),Promise.race()
他们的差别是all全部返回resolve才会执行then,若碰到一次reject则终止返回catch。
而race谁最快返回,就结束,返回最快的结果。
显然我们需要每个结果的话race就不太合适了。选用all,
看代码:
//selectedItem为选中数组大致结构为[{key:1, code:'编号123'}]
//action validOrder 下 发送当是一份fetch。可以接受success,reject
handleValidOrders() {
Confirm({
content: '您确定要作废这些订单吗?',
onConfirm: () => {
const { user, actions } = this.props
Promise.all(
this.state.selectedItem.map(s => (
new Promise((resolve, reject) => {
actions.validOrder({
token: user.info.token,
id: s.key,
body: {
reason: this.invaildsReason || '文本',
},
success: data => {
resolve({mess:'success'})
},
reject: data => {
resolve({mess:'err',code: s.code})//当遇到错误的时候当做正确压入结果数组,不执行reject
}
})
}
)))
).then((res) => {
this.handlerResolve(res)
}).catch((err) => {
message.error('遇到错误啦!')
this.load()
//刷新
})
},
})
}
//分析结束后当结果
handlerResolve(res) {
const err = res.filter(er => er.mess === 'err') //获得失败的请求
if(err.length > 0) {
const errCode = err.map(c => c.code)
//有失败当情况,结合返回当信息,给用户确切当结果。
message.error(`编号为:${errCode.join(',')} 的订单操作失败!`)
}else {
message.success('作废成功!')//全部成功当情况
}
this.load()//刷新数据
}
网友评论