我正在使用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>
}
}
答案 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
。或者只是不要抓住任何东西并让它冒泡。