2016-05-25 3 views
2

Meteor использует обратные вызовы, но кажется, что их нет с действиями Redux. Таким образом, если использовать что-то вроде Redux и имеет что-то действие, как это:Метеор, как ждать по обратному вызову перед отправкой Redux action

export function loginWithPassword(email, password) { 
    return dispatch => { 
    Meteor.loginWithPassword(email, password, error => { 
     if (error) { 
     return dispatch({type: ASYNC_ERROR, data: error.reason}) 
    }); 
    } 
} 

... действие будет заполнить и вернуть до того делает вызов метеора (таким образом, повторно не рендеринг пользовательского интерфейса, если это необходимо). Я часами пытаюсь найти лучший способ справиться с этим безрезультатно. На основании того, что я смог найти, казалось бы, есть варианты Meteor Futures или Promises, однако я не могу найти ничего, указывающее, что может быть лучше или почему.

Я считаю, что фьючерсы могут быть только серверными и менее широко используются, чем обещания, поэтому обещания могут быть лучшими вариантами, основанными на этом. Я даже не уверен, что Futures - это вариант, поскольку действия на стороне клиента. Но я также не уверен, что Метеор будет хорошо играть с обещаниями, учитывая общий характер синхронизации.

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

Есть ли у кого-нибудь какие-либо мысли или представление о том, как лучше справляться с чем-то подобным? Рабочий пример того или другого (или обоих) был бы замечательным, потому что я точно не смог найти его после нескольких часов поиска. В частности, было бы замечательно увидеть пример простого входа в Meteor с паролем, отправленным через Redux, который отображает ошибку «Пользователь не найден» или какую-либо другую «асинхронную» ошибку в форме входа в систему пользователя (ПЕРВЫЙ момент времени).

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

ТИА!

PS есть несколько примеров там, что дисплей ошибка в окне предупреждения или console.log, но это не то же самое, что обновление/отображение его в качестве опоры в пользовательском интерфейсе, который отправил действие. Нет никаких повторных ссылок на оповещение или консоль. ог. Вся идея состоит в том, чтобы показать ошибку в том виде, в котором пользователь в данный момент находится (форма входа в этом примере)

+0

Можете указать, где Метеор утверждает, что синхронизация в этом отношении? Я не знаю такого требования. Методы обратного вызова метода Метеор являются асинхронными по своей природе, поэтому вам нужно будет обрабатывать их в форме асинхронизации, будь то Redux или любой другой менеджер состояний. – MasterAM

+0

См. Раздел API здесь, как один пример, в котором описаны Meteor API ... https://github.com/meteorhacks/meteor-async –

+0

Это относится только к серверу.Волокна позволяют Meteor использовать синхронный синтаксис с асинхронными API на сервере, но он не имеет ничего общего с клиентом. BTW, репозиторий, с которым вы связались, не является официальным ресурсом Meteor, хотя Arunoda является видным членом сообщества Meteor. – MasterAM

ответ

0

Использование redux-thunk, вы можете написать что-то вроде ниже. Я думаю, что трюк здесь зная состояние объекта пользователя, как только он вошел в систему в один из способов сделать это является использование store.dispatch Внутри Tracker.autorun:.

// whenever the reactive data changes, we will dispatch the appropriate action 
Tracker.autorun(() => { 
    if (Meteor.loggingIn()) { 
    return store.dispatch({ 
     type: LOGGING_IN, 
    }); 
    } 

    const user = Meteor.user(); 

    store.dispatch({ 
    type: SET_USER, 
    user, 
    } 
}); 

export const login = ({ email, password }) => (dispatch) => { 
    Meteor.loginWithPassword(email, password, (error) => { 
    if (error) { 
     return dispatch({ 
     type: LOGIN_ERROR, 
     error, 
     }); 
    } 

    return dispatch({ 
     type: LOGIN_SUCCESS, 
    }); 
    }); 
}; 

Вы можете представить себе редуктор пользователя, который имеет состояние, как {user: {loggingIn: Boolean, authError: SomeErrorModel}}} или что-то подобное

Вы можете очистить authError на LOGGING_IN, и добавить его на LOGIN_ERROR

Для любых изменений пользовательского интерфейса на основе этого редуктора, просто подключите ваш реагировать компонент с react-redux «s connect()

+0

Что происходит с оптимистическим интерфейсом, который предлагает Meteor, когда вы используете Thunk для выполнения запроса асинхронно, не вызывает ли это задержка? Также, где вы конкретно помещаете 'Tracker.autorun()', внутри презентации или контейнера? – JohnnyQ

+0

Оптимистичный пользовательский интерфейс должен менять Meteor.user() внутри Tracker и возвращаться, если он получает проблему с сервера. – srtucker22

+0

Что касается Tracker.autorun(), это более важная концепция, но мне нравится, чтобы вся метеорная логика была отделена от компонентов. Метеор происходит в Tracker.autorun или в действиях, сообщая о редукторах и используя connectx() для компонентов redux. С этой установкой все состояние Meteor сохраняется в сокращении, и все компоненты знают, что это состояние redux. В противном случае вы закончите разделение «Метеор» и «Сокращение», и теперь вам нужно отслеживать два государственных магазина, которые могут быть ночным кошмаром. – srtucker22

Смежные вопросы