Почему моя функция response / redux не возвращает обещание?

Я нахожусь в действиях своей тележки и вызываю loadCartItems () из другой функции в том же файле. Однако эта функция не возвращает обещание или какие-либо данные, и я не знаю почему. Моя функция loadCartItems () на самом деле даже не рассматривается как функция. Кто-нибудь знает, почему это может быть?

export function loadCartItems() {
    return (dispatch, getState) => {
        dispatch({
            type: types.LOAD_CART_PRODUCTS
        });
        return AsyncStorage.getItem(STORAGE_KEY_JWT_TOKEN).then((key) => {
            return API.getCartItems(key)
                .then((response) => {
                    return dispatch({
                        type: types.LOAD_CART_PRODUCTS_SUCCESS,
                        response
                    });
                }).catch(err => {
                    console.info('Error retrieving cart products');
                })
        }).catch(err => {
            console.info("Error retrieving cart items from local storage");
        });
    };
}

export function getUnaddedCartItems() {
    return (dispatch, getState) => {
        dispatch({
            type: types.GET_UNADDED_ITEMS
        });        
        return AsyncStorage.getItem(STORAGE_KEY_CART_ITEMS).then((result) => {
            const addedItems = JSON.parse(result);

            loadCartItems()
                .then((result) => {
                    const cartItems = result.response.products;

                    if (this.state.unaddedCartItems.length === 0) {
                        const unaddedCartItems = addedItems.filter((addedItem) => {
                            return cartItems.find(cartItem => cartItem.id !== addedItem.productId);
                        });
                    }
                }).catch(err => {
                    consoel.log('error: ', err);
                });
        }).catch(error => {
            console.info('error: ', error);
        });
    };
}

Почему моя функция response / redux не возвращает обещание?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
223
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

this.loadCartItems() - это не функция. loadCartItems() есть.

Поскольку они не входят в общий класс / объект / что-то, нет необходимости использовать this. Он в основном действует как глобальный (в контексте этого файла), поэтому просто вызывайте его напрямую.


Если присмотреться к нему поближе, похоже, что вы пытаетесь вызвать создателя действия внутри создателя действия. Это твоя проблема.

Обычно вы сопоставляете эти действия в своем компоненте, поэтому бит dispatch позаботится за вас. Однако, когда вы вызываете функцию непосредственно сами, вам также нужно иметь дело с ней самостоятельно.

loadCartItems().then - это то, что не работает сейчас, когда вы удалили this. В этом есть смысл, поскольку loadCartItems() фактически возвращает функцию, а не Promise. Функция принимает два аргумента: dispatch и getState.

Называть его нужно так: loadCartItems()(dispatch, getState).then().

Хорошо, я только что обновил свой вопрос. Я пробовал использовать его без «этого». перед loadCartItems (), но он по-прежнему говорит, что это не функция. Почему??

FairyQueen 02.04.2018 19:00

На самом деле это не говорит о том, что loadCartItems() не является функцией

В нем говорится, что loadCartItems(...).then не является функцией.

Что это значит?

Фактически, loadCartItems(...).then не является функцией, потому что функция не возвращает Promise. Возвращает другая функция!

Как указано в redux-thunk документы:

Any return value from the inner function will be available as the return value of dispatch itself.

Итак, чтобы правильно вызвать действие loadCartItems(), вы должны сделать

dispatch(loadCartItems(anyParamYouWant)).then(...)

Я бы порекомендовал вам взглянуть на документацию redux-thunk, чтобы помочь вам лучше понять, как работают преобразователи;)

И loadItems, и getUnaddedCartItems возвращают thunks, а не обещания.

Поэтому они должны быть отправлены в первую очередь, чтобы они вернули обещания, которые вы ожидаете.

Этот код отправки перед возвратом обещания кажется ненужным, поэтому, если он вам действительно не нужен, просто пусть функции возвращают обещания.

Другие вопросы по теме