Как обеспечить выполнение функции с обещанием продолжить выполнение - PullRequest
0 голосов
/ 03 марта 2020

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

confirm = () => {
  this.props.addEvent(args);
  this.props.loading != true ? this.props.navigation.dispatch(popAction) : null; 
}

действие addEvent () выглядит следующим образом:

export const addEvent = (event, msgId, convoId) => {
    return (dispatch) => {
        dispatch({ type: types.UPDATING });
        console.log('Firestore Write: (actions/agenda) => addEvent()');

        return firebase
            .firestore()
            .collection('events')
            .add({
                date: event.date,
                token: event.token,
                withName: event.sender
            })
            .then((success) => {
                updateReqToScheduled(msgId, { uid: event.schedulerId, convoId: convoId });
                dispatch({ type: types.EVENT_ADD_SUCCESS });
            })
            .catch((err) => {
                console.log('ERROR => addEvent()' + '\n' + err.message);
                dispatch({ type: types.EVENT_ADD_FAIL, info: err.message });
            });
    };
};

выполняется инструкция журнала pre-firebase, добавляется документ и updateReqToScheduled начинается выполнение функции. это выглядит так:

const updateReqToScheduled = (id, reader) => {
    console.log('Firestore Write: (actions/agenda) => updateReqToScheduled()');
    return firebase
        .firestore()
        .collection('messages')
        .doc(id)
        .update({ read: true })
        .then((success) => {
            return updateConvoUnread(reader);
        })
        .catch((err) => {
            console.log(err.message);
        });
};

эта функция также выполняется полностью. updateConvoUnread() функция выглядит следующим образом:

const updateConvoUnread = (reader) => {
    console.log('Firestore Read: (actions/agenda) => updateConvoUnread( 1 )');
    return firebase
        .firestore()
        .collection('messages')
        .where('userConvos', 'array-contains', reader.convoId)
        .where('sender', '!=', reader.uid)
        .where('read', '==', false)
        .get()
        .then((querySnapshot) => {
            console.log('PRECONDITION');
            if (querySnapshot.empty == true) {
                console.log('Firestore Write: (actions/agenda) => updateConvoUnread( 2 )');

                return firebase
                    .firestore()
                    .collection('user-conversations')
                    .doc(reader.convoId)
                    .update({ unread: false });
            } else {
                console.log('ELSE CLAUSE');
                //return;
            }
            console.log('POST - IF');
        })
        .catch((err) => {
            console.log('ERROR => updateConvoUnread(): ' + err.message);
        });
};

выполняется самый первый оператор журнала pre-firebase, но не выполняется никакой другой оператор журнала, ни в then(), ни в catch(), ни в условный оператор, таким образом, выполнение функции прекращается, а сброс стека навигации не выполняется.

Кто-нибудь может посоветовать ситуацию?

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Используйте asyn c в ваших объявлениях функций и ожидайте вызовов firebase

0 голосов
/ 03 марта 2020

Что-то не так с запросом firebase. Название поля было неверным. это остановило все. После исправления функция завершилась, как и ожидалось, и маршрут был сброшен.

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