асинхронные действия с обещаниями и редуксом - PullRequest
0 голосов
/ 09 мая 2018

Сначала я пытаюсь вызвать updateValuesRouting - когда значение изменяется, я хочу полностью независимое действие, вызываемое (после полного завершения updateValuesRouting) в publishRouting. Проблема в том, что если я уберу тайм-аут из приведенного ниже кода, база данных закроется, и мои вызовы API больше не будут работать:

export function publishRouting(routingID, versionID, un, values){
    const url = `${ROOT_ROUTINGS_URL}/${routingID.trim()}/${versionID.trim()}/publish?username=${un}`;
    console.log("publish url:::",url);
    return dispatch => {
        dispatch({type: PUBLISH_ROUTING_LOADING, isLoading:true});
        dispatch(updateValuesRouting(values, routingID)).then(
            setTimeout(() => {
                axios.put(url)
                    .then(({data}) => {
                        console.log("publish data returned:::", data);
                        dispatch(alertMessage("success", `${routingID} has been published!`));
                        dispatch(goToRouting(data.routingID, "000", history));
                        //window.location.reload();
                        dispatch({type: PUBLISH_ROUTING_SUCCESS, data}) ;
                    })
                    .catch((err) => {
                        dispatch(alertMessage("danger", `${routingID} failed with the following: ${err}`));
                        dispatch({type: PUBLISH_ROUTING_FAILURE, isCheckedOut: false, err})
                        console.log("publish error:", err);
                    })
            }, 500)
        );
    };
}

export function updateValuesRouting(values, routingID ){
    const url = `${ROOT_ROUTINGS_URL}/${routingID.trim()}/editing/meta`;
    console.log("routing url:: ",url, values);
    return dispatch => {
        dispatch({type: UPDATE_VALUE_ROUTING_LOADING, isLoaded: false});
        return axios.put(url, values)
            .then(({data}) => {
            console.log("returned values from updateValuesRouting:",data);
                let myKeys = Object.keys(data);
                let ind;
                ind= myKeys.findIndex((x)=>{return x === 'headers'});
                myKeys.splice(ind, 1);
                ind= myKeys.findIndex((x)=>{return x === 'lastEditedDate'});
                myKeys.splice(ind, 1);
                ind= myKeys.findIndex((x)=>{return x === 'routingEditorMetaKey'});
                myKeys.splice(ind, 1);
                myKeys = myKeys.toString();
                dispatch(alertMessage("success", `${routingID} has updated ${myKeys}!`));
                dispatch({type: UPDATE_VALUE_ROUTING, data, isLoaded:true});

                return Promise.resolve();
            })
            .catch((err) => {
                dispatch(alertMessage("danger", `${routingID} has not updated values. ${err}`));
                dispatch({type: UPDATE_VALUE_ROUTING_FAILURE, isLoaded: true})
            })
    }
}

При тайм-ауте все работает правильно, но я не могу гарантировать, что тайм-аут является действительным временем для сервера. Ясно, что я хотел бы, чтобы обещание было полностью выполнено. Как я могу проверить, что isLoaded имеет значение true для updateValuesRouting, чтобы убедиться, что я могу сделать следующий вызов Axios и обновить свои значения с сервера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...