2015-03-05 3 views
0

Я хочу показать загрузчик, когда происходит аутентификация. У меня есть действие sendAuthCredentials. На этом мероприятии я хочу сделать несколько действий: запрос аутентификацииМогу ли я отправить несколько событий по действию в поток?

  1. Показать погрузчик
  2. Отправить на сервер
  3. Ручки ответ и сообщить UserStore проверки подлинности пользователя или не
  4. Скрыть Loader.

У меня есть Loader реагировать компонент, LoaderStore и LoaderAction для работы с компонентом.

Так что мой sendAuthCredentials метод выглядит следующим образом:

UserActions = { 
/** 
* @param {string} username 
* @param {string} password 
*/ 
    sendAuthCredentials: function(username, password) { 
    return Q.all(
     [ 
     LoaderActions.showLoader(), 
     authenticateUser(username, password) 
      .then(function(data) { 
      if(data) { 
       AppDispatcher.handleViewAction({ 
       type: ActionTypes.USER_LOGIN_SUCCESS, 
       data: data 
       }); 
       return Q("succcess"); 
      } else { 
       AppDispatcher.handleViewAction({ 
       type: ActionTypes.USER_LOGIN_FAIL 
       }); 
       return Q("failed"); 
      } 
      }) 
     ] 
    ).then(LoaderActions.hideLoader); 
    } 
}; 

Это работает, но я не уверен, правильно ли это способ использовать действия в Flux.

Спасибо за ответ.

ответ

1

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

С Flux у вас будет UserStore, где вы можете хранить, если этот пользователь был аутентифицирован или нет (плюс другие данные, которые вы хотите сохранить о пользователе). Затем вы можете просто запросить загрузчика, пока не получите событие, отправленное из UserStore, сообщив вам, что пользователь аутентифицирован или нет.

var authenticateUser = function(username) { 
    <getRequestToAuthentticationResource> 
    .then(function(data){ 
    <storeDataInUserStore> 
    emitAuthenticated(); 
    }) 
} 
var UserStore = _.extend({}, EventEmitter.prototype, { 
    dispatcherIndex: AppDispatcher.register(function(payload) { 
    var action = payload; 
    switch (action.actionType) { 
    case UserConstants.AUTHENTICATE: 
     authenticateUser(action.username); 
     break; 
    } 
} 

Под примером того, как ваше приложение будет слушать и обрабатывать событие. Просто уточнить, это очень простой компонент. Вы можете лучше проверить authCode, чем с if-else.

var YourApp = React.createClass({ 
    getInitialState: function() { 
    return { 
     authCode: "loading" 
    } 
    }, 

    componentDidMount: function() { 
    UserStore.addAuthListener(this._onChange); 
    },  

    _onChange: function() { 
    setState({ 
     authCode: UserStore.getAuthCode() //Sucess or fail 
    }); 
    } 

    render: function() { 
    if(this.state.authCode === "loading"){ 
     return <load information> 
    } else if(this.state.authCode === "success") { 
     return <success information> 
    } else { 
     return <fail> 
    } 
} 

Тогда ваш React-компонент просто хотел, чтобы увидеть, какие данные он хотел бы получить и показать либо информацию о пользователе, ошибку или манипулятором.

Просто помните, что вам нужен addAuthListener в вашем магазине и emitAuthenticated для выполнения этой работы.

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

+0

Благодарим за отзыв. Насколько я понимаю, вы отправляете асинхронные запросы в магазине. Я прав? Но, как я понимаю, также нормально отправлять запросы на действия. Также я хочу иметь компонент Loader, который я буду использовать несколько раз. аутентификация пользователя, публикация комментариев и т. д. Поэтому я инициализирую в потоках данных 2 действия: для обновления «UserStore» и для обновления «LoaderStore». Поэтому я не уверен, могу ли я сделать так или нет. – Zapix

+0

Вы можете отправить асинхронный запрос в магазин, но я думаю, что его вообще немного красивее, чтобы сделать это в ActionDispatcher. Если вы хотите использовать компонент многоразового загрузчика, я думаю, вам нужны разные случаи, в зависимости от того, в какой области вы находитесь, или если вы можете подумать о событии, которое может быть запущено, и сообщить каждому загрузчику о завершении. Вы можете сделать это, как вы предлагаете, но я не уверен, что вам нужен собственный LoaderStore. Какую информацию вы должны хранить за пределами компонента Loader? Не забудьте использовать свойства и состояния в своих интересах. – magnudae

+0

У меня есть статус загрузчика (отображение или нет) в LoaderStore. Я использую состояние для управления компонентом загрузчика. поэтому у меня есть действия: showLoader и hideLoader. LoaderStore испускает событие при изменении состояния загрузчика. Компонент загрузчика прослушивает события и показывает загрузчик или нет. Этот компонент выглядит неплохо, но я должен отправить действия showLoader/hideLoader из других действий. И я не уверен, правильно это или нет. – Zapix

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