拒绝使用async / throw而不是promise来反应redux形式

时间:2017-07-08 17:46:56

标签: promise react-redux-form

我正在使用react redux form将表单数据发送到服务器。如果我返回一个失败的promise,那么表单将正确显示失败但是如果我抛出或使用async / await with throw则不会。我仍然要退回被拒绝的承诺。不确定我在这里缺少什么,或者这是不是事情的方式。

使用:

export const myRequest = (data) => {
   return new Promise((resolve, reject) => {
    reject('Login failed!')
   })
}

不(以及async / await变体):

export const myRequest = (data) => {
   throw new Error('Login failed')
}

我必须做的事情:

export const myRequest = (data) => {
  try {
    ...
  } catch (err) {
     return new Promise((resolve, reject) => {
       reject(...)
   })
  }  
}

这是我正在使用的一些异步代码。我必须将错误消息包装在一个promise中,以便表单获取消息,我不确定为什么它在我抛出时不会以相同的方式获取消息。

const myRequest = async ( data) => {
  try {
    let response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(data)
    })

    if (!response.ok) {
      throw new Error(response.statusText)
    }
    return await response.json()
  } catch (err) {
    // Not working - no error message makes it - though it gets that it's an error
    throw new Error(err) // or new Error(err.message) or new Error('foo')

    // Works
    // return new Promise((resolve, reject) => {
    //   reject(err.message)
    // })
  }
}

我的React Redux表格:

import myRequest from '...'

handleSubmit (values) {
  const { dispatch } = this.props
  dispatch(actions.submit('subscribe', myRequest(values)))
}

render () {
   const { valid, pending, submitted, submitFailed } = this.props.form
  return (
    <Form model='subscribe' onSubmit={(values) => this.handleSubmit(values)}>
    { !valid && submitFailed ? <Alert>          
      <Errors
        model='subscribe' // Form name as found in reducer
      /> : null
    }
    </Form>
  }
}

3 个答案:

答案 0 :(得分:1)

React-Redux-Form创建者在这里。这已经修复,将在下一版本中发布:https://github.com/davidkpiano/react-redux-form/issues/877

答案 1 :(得分:0)

我认为redux表格预计会被退回。幸运的是,所有异步函数总是返回promise。我敢打赌,如果你把代码更改为:

 export const myRequest = async (data) => {
   throw new Error('Login failed')
 }

你会把错误锣送到正确的地方。

答案 2 :(得分:0)

使用async function是正确的做法。但是,要获得reject(err.message)的等效值,您需要执行throw err.message。但你应该never throw strings,更好throw new Error(err.message)。或者只是throw err。或者只是不要抓住任何东西并让它冒泡。