React Redux асинхронная мультидиспетчерская - PullRequest
0 голосов
/ 30 ноября 2018

Я сделал простую многофайловую форму ввода с onChange, когда вы выбираете изображение, оно отправляет запрос API в API.Он возвращает информацию об информации об изображениях внутри таблицы в порядке выбора.

У меня есть одна проблема, он отправляет несколько изображений, но я не хочу ждать, пока предыдущее отправит другой запрос.Я хочу, чтобы он был асинхронным, но я хочу, чтобы он имел статус, чтобы вы могли видеть статус внутри таблицы.

Это у меня сейчас получилось:

Действие для каждого файла ввода

/**
 * Fileupload request
 */
export const FILEUPLOADER_REQUEST_REQUEST = 'FILEUPLOADER_REQUEST_REQUEST';
export const FILEUPLOADER_REQUEST_SUCCESS = 'FILEUPLOADER_REQUEST_SUCCESS';
export const FILEUPLOADER_REQUEST_ERROR = 'FILEUPLOADER_REQUEST_ERROR';

export function fileuploader_request(payload){
    return function (dispatch, getState){
        dispatch(fileuploader_request_request());
        const { access_token } = getState().auth
        const { image } = payload;
        const formdata = new FormData();
        formdata.set('image', image);
        axios({
            method: 'post',
            url: process.env.REACT_APP_API_URL + '/v1/compressor',
            data: formdata,
            headers: {
                'Accept': 'application/json',
                'Authorization': 'Bearer ' + access_token
            }
        }).then(function (response) {
            const payload = {
                compressed_image: response.data.data
            }
            dispatch(fileuploader_request_success(payload));
        }).catch(function (error) {
            dispatch(fileuploader_request_error(error.response.data.error));
        });
    }
}

export function fileuploader_request_request(){
    return {
        type: FILEUPLOADER_REQUEST_REQUEST
    };
}

export function fileuploader_request_success(payload){
    return {
        type: FILEUPLOADER_REQUEST_SUCCESS,
        payload
    };
}

export function fileuploader_request_error(payload){
    return {
        type: FILEUPLOADER_REQUEST_ERROR,
        payload
    };
}

Редуктор

import {
    FILEUPLOADER_REQUEST_REQUEST,
    FILEUPLOADER_REQUEST_SUCCESS,
    FILEUPLOADER_REQUEST_ERROR
} from './actions';

const initialState = {
    compressed_images: [],
    request: {
        fileuploader: {
            request: false,
            success: false,
            error: {}
        }
    }
}

export default function(state = initialState, action) {
    const {
        type,
        payload
    } = action;
    switch (type) {
        case FILEUPLOADER_REQUEST_REQUEST:
            return {
                ...state,
                request: {
                    ...state.request,
                    fileuploader: {
                        request: true,
                        success: false,
                        error: {}
                    }
                }
            }
        case FILEUPLOADER_REQUEST_SUCCESS:
            return {
                ...state,
                compressed_images: [...state.compressed_images, payload.compressed_image],
                request: {
                    ...state.request,
                    fileuploader: {
                        request: false,
                        success: true,
                        error: {}
                    }
                }
            }
        case FILEUPLOADER_REQUEST_ERROR:
            return {
                ...state,
                request: {
                    ...state.request,
                    fileuploader: {
                        request: false,
                        success: false,
                        error: payload
                    }
                }
            }
        default:
            return state;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...