2017-01-17 15 views
4

与承诺一起使用处理程序可能/安全吗? 例如:异步重组withHandlers ...?

withHandlers({ 
    onChange: props => event => { 
     props.callAPI(props.data) 
     .then(data => props.updateData(data)) 
    }, 
... 

谢谢!

回答

3

经过一些测试后,我意识到它工作得很好。 Recompose建筑用纯组分的岩石。

这是完全有效的,工作得很好。

const enhWithHandlers = withHandlers({ 
    loginUserMutation: props => args => { 
    props.updateMutationState(loading: true, error: null }); 
    props.loginUser(args) 
     .then(() => 
     props.updateMutationState({loading: false, error: null })) 
     .catch(err => 
     props.updateMutationState({ loading: false, error: err })); 
    } 
}, 
... 
// then compose like 
export default compose(
    reduxConnect, 
    gqlConnectLogin, 
    gqlConnectRegister, 
    enhWithState, 
    enhWithHandlers 
)(UserLoginRegister); 

它帮助我克服不足,以反映graphQl突变的结果与Apollo client的包裹成分的能力。这可以完美地处理它,而不需要组件本身的副作用。

+0

是的,它是安全的,并可能 – wuct

0

但也存在一些问题,当我们用这样的:

compose(
    withState('loginStatus', 'setLoginStatus', {loading: false, error:null}), 
    withHandlers({ 
    loginUserMutation: props => async args => { 
     try { 
     props.setLoginStatus({loading: true, error: null}); 
     await props.loginUser(args); 
     } catch(error) { 
     props.setLoginStatus({...props.loginStatus, error}); 
     } finally { 
     props.setLoginStatus({...props.loginStatus, loading: false}); 
     } 
    } 
    }) 
) 

因为props引用之后,我们确实await props.loginUser(args)丢失。然后我们在错误之后使用它。

我们应该注意不要像上面那样使用它。


+0

我不明白'props'基准丢失。这不是,你甚至不使用它。也许你的意思是终于没有运行。如果'loginUser(args)'更改应用程序状态,以便卸载已包装的组件,那么这很有意义。或者你可以详细说明一下吗?我们广泛使用'recompose',并且绝对没有问题。 – DavidC

+0

我的意思是说'props'等于'this.props',但是在你设置了loginLoginStatus并等待loginUser后(setLoginStatus就像this.setState),那么参数'props'不等于'this.props' ....它就像:'const props = this.props; this.setState({XXX}); api()。then(_ => console.log(props == this.props));'它会记录'false' ... – xialvjun

+0

我建议不要考虑重组作为一个有状态的组件你的'await props.loginUser(args);'会改变更高组件中的道具,并且会触发组件树的重新计算,这就是为什么在这个'await'后道具可能会有所不同,如果loginUser更改组件层中的道具(但只有当你传递这个信息的时候)。这就是为什么通常如果你使用例如分支(决定是否显示登录或用户数据),在loginUser之后你的组件将被卸载,将成为无操作。 – DavidC