【问题标题】:React-redux action is returning before async action is completeReact-redux 操作在异步操作完成之前返回
【发布时间】:2018-07-06 22:05:00
【问题描述】:

我有一个使用 redux 的 React Native 应用程序,我希望我的操作可以设置 GPS 坐标,以便在商店中提供它们。您可以在代码中看到我的控制台日志,并且在“有坐标”之前记录了“返回操作”,这就是问题所在。

组件:

<TouchableOpacity style={{flex:1}} onPress={() => {
    this.props.setLocation();
}}>

Action.js

export function setLocation(){

    let coords = {
        latitude:0,
        longitude:0,
        navigatorError:''
    };

    navigator.geolocation.getCurrentPosition(
      (position) => {
        console.log('has coordinates');
        coords['latitude'] = position.coords.latitude
        coords['longitude'] = position.coords.longitude
        coords['navigatorError'] = null
      },
      (error) => coords['navigatorError'] = error.message,
        { enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 },
      );

    console.log('action returning');
    return {
      type: 'set_location',
      payload: coords
    };
};

Reducer.js

export default (state = null, action) => {
    switch(action.type){
        case 'set_location':
            return action.payload;
        default:
            return state;
    }
}

注意:我实际上并没有在这个项目中使用 redux-thunk,我不确定它是否适合我在这里的需要。

【问题讨论】:

    标签: react-native react-redux redux-thunk


    【解决方案1】:

    您可以使用asyncawait 来完成此操作。基本上,您需要 await 从异步调用返回的坐标。

    类似这样的:

    export async function setLocation(){
    
        let coords = {
            latitude:0,
            longitude:0,
            navigatorError:''
        };
    
        await navigator.geolocation.getCurrentPosition(
            (position) => {
                console.log('has coordinates');
                coords['latitude'] = position.coords.latitude
                coords['longitude'] = position.coords.longitude
                coords['navigatorError'] = null
            },
            (error) => coords['navigatorError'] = error.message,
                { enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 },
            );
    
        console.log('action returning');
        return {
            type: 'set_location',
            payload: coords
        };
    };
    

    关于 async/await 的文档可以在 here 找到。

    【讨论】:

    • 我正在尝试这个,我得到:Actions must be plain objects. Use custom middleware for async actions.
    • 这是因为您的 getCurrentPosition 函数在技术上应该由副作用库(例如 Thunk 或 Sagas)处理。动作几乎不应该做任何比返回类型和有效负载更多的事情。其他任何事情都应该由副作用库处理。
    • 我正在看的教程似乎使用axiosthen(),这不适合我的情况。 getCurrentPosition() 完成后如何让我的操作发送?
    • 基本上,您将设置两个操作。一个用于分派以获取位置,然后一个用于分派获取已成功。更新状态(一个用于错误情况可能是个好主意)。如果你愿意,我可以告诉你这一切如何结合在一起。不过,我对 Saga 比对 Thunk 更熟悉,但我想这种模式不会有太大不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2023-04-04
    相关资源
    最近更新 更多