2016-07-21 6 views
0

- Для начала извинения за неоднозначное название. Проблема, с которой я сталкиваюсь, я действительно смущен, как поставить заголовок. Я открыт для редактирования. В принципе, я использую response-redux, и у меня есть модальный, в котором я обновляю некоторое содержимое в базе данных. При обновлении я хочу, чтобы все состояние редуктора было по умолчанию и закрыло модальное. (Это прямо, поскольку я запускаю функцию при обновлении, которая устанавливает все значения по умолчанию) Однако при обновлении я хочу закрыть модальное и отобразить toastr при обновлении или сообщении об ошибке из ответа. Я создал компоненты и действия для тоста.Как асинхронно сбросить значения redux

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

Modal.jsx

//update 
    updateConfig() { 
      this.props.updateConfigNode(node, latestConfigData); //update action 
      this.closeModal(); 
     } 
    closeModal() { 
     this.props.status(false); //Close modal 
     this.props.update(''); //Set update action status 'updated or error' to '' 
     } 

Toastr.jsx

componentDidUpdate() { 
    this.routerConfigNotification(this.props.config); //Getting from store 
    } 
    configNotify(config) { 
     const message = checkForRouterConfigUpdateState(config); 
    if(message) { 
      this._addNotificationNormal(message.title, message.type, message.text); 
      } 
    } 

Utils

export function checkForRouterConfigUpdateState(routerConfig) { 

    let message = {}; 
    let messageText; 

    switch (_.get(routerConfig, 'updateStatus')) { 
case '_error': 
     messageText = 'An error has been occurred while updating configuration'; 
     return message = { 
     mode: 'normal', 
     title: 'Error', 
     type: 'info', 
     status: _.get(routerConfig, 'updateStatus'), 
     text: messageText 
     }; 

    case '_updated': 
     messageText = 'Successfully Updated'; 
     return message = { 
     mode: 'normal', 
     title: 'Updated', 
     type: 'info', 
     status: _.get(routerConfig, 'updateStatus'), 
     text: messageText 
     }; 
} 
} 

Я пробовал другие lifec ycle, но самым близким к решению этой проблемы является использование функции setTimeout, которая, как я знаю, является взломом, и я уверен, что есть способ решить такие проблемы асинхронности. Спасибо заранее.

+0

Умм, снято в темноте, но почему вы настаиваете на перепродаже модального состояния при обновлении? Просто перезагрузите его, пока он не откроется, и вы золотые, нет? – WTK

+0

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

+0

Thunk используется для асинхронных действий в redux. Вы заглянули в него? – andHapp

ответ

0

Есть this.props.updateConfigNode(node, latestConfigData) обещание? Если это так, вы можете положить closeModal в блок then, чтобы он был вызван только тогда, когда ваш запрос будет выполнен.

this.props.updateConfigNode(node, latestConfigData).then(() => { 
    this.closeModal(); 
}); 
+0

Это не обещание. –