Promise并发处理(react)

有时候需要处理一些批量操作,这样就有可能用到并发操作。
先看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()//刷新数据
  }

你可能感兴趣的:(Promise并发处理(react))