Получить API и состояние ожидания для обновления в массиве - PullRequest
0 голосов
/ 21 марта 2019

У меня есть объект массива. Я хочу перебрать массив и диспетчеризировать действие. К сожалению, не дожидаясь, пока первый объект завершит диспетчеризацию, 2-й объект начинает диспетчеризировать действие, как и 3-й, 4-й, 5-й .. объекты.

В настоящее время я выполняю функцию updateCategory, чтобы пользователь мог загрузить изображение, а затем обновить категорию. Пользователь может перетаскивать много изображений и назначать изображениям различные теги. Я храню изображения и теги в объекте массива. Моя концепция такова: из объекта массива загрузить изображение, а затем немедленно обновить категорию загруженным изображением и его тегом, один за другим.

Вот проблема. Я извлекаю api для загрузки изображения и обновляю api категории из итераций массива, используя Promise. Не дожидаясь обновления состояния избыточности, он немедленно получает api загружаемого изображения. И наконец, обновленная категория - это всегда последнее изображение и последний тег в массиве.

Это мой код:

function uploadAndUpdateSubcategoryMedias(Image, ArticleCategoryId, ArticleSubcategoryTag) {
    return (dispatch, getState) => {
        return dispatch(uploadSubcategoryMedia(Image)).then(() => {
            const uploadedImg = getState().media.media.Data;
            var MediaFiles = [];
            MediaFiles.push(uploadedImg);
            return dispatch(updateArticleSubcategoryMedias(ArticleCategoryId, ArticleSubcategoryTag, MediaFiles))
        })
    }
}

function subcatMediaTesting(subcategoryMediasArr) {
    return async (dispatch) => {
        var promises = [];
        subcategoryMediasArr.forEach((item) => {
            var response = dispatch(uploadAndUpdateSubcategoryMedias(item.image, item.articleCategoryId, item.tagName));
            promises.push(response);
        })
        return Promise.all(await promises)
    }
}

Как я могу выполнить итерацию объекта массива так, чтобы он отправил upload_Media_Request -> upload_Media_Success -> update_Category_Request -> update_Category_Success, затем следующий элемент снова запустил этот процесс? Или, может быть, есть другой способ выполнить это, чтобы я мог обновить все категории, а не только категорию последнего элемента?

Спасибо за помощь!

1 Ответ

0 голосов
/ 25 марта 2019

Имейте в виду, что dispatch () возвращает обещание. Вы делаете это в вызове fetch: dispatch (...). Затем (...). Я бы попробовал диспетчеризацию (FIRST_ACTION) .then (... поместите ваш вызов извлечения здесь ...).

...