如何确定Redux操作何时完成

时间:2017-08-08 17:55:19

标签: javascript reactjs redux react-redux redux-thunk

我正在使用谷歌搜索,但我还没有找到任何东西,或者我只是不理解它。我有Redux Thunk,我正在查看他们的例子,但我不确定这是否对我有帮助?

我通常会使用Promise ..但是根据我的理解,当Redux更新状态时,它是异步完成的......所以我不认为这会起作用吗?

<?php

$field_name = $_POST['name'];
$email = $_POST['email'];
$field_message = $_POST['message'];

$mail_to = 'example@yahoo.co.uk';

$subject = 'Message from a site visitor ' . $field_name;

$body_message = 'From: '.$field_name."\n";
$body_message .= 'E-mail: '.$email."\n";
$body_message .= 'Message: '.$field_message;

$headers = "From: $email\r\n";
$headers .= "Reply-To: $email\r\n";

$mail_status = mail($mail_to, $subject, $body_message, $headers);

if ($mail_status) { ?>
<script language="javascript" type="text/javascript">

alert('Thank you for the message. We will contact you shortly.');

window.location = 'contact.php';
</script>

else { ?>
<script language="javascript" type="text/javascript">

alert('Message failed. Please, send an email to example@yahoo.co.uk');

window.location = 'contact.php';
</script>
<?php
}?>

编辑:

这就是我在想的事情...但我认为不会起作用,因为状态不是异步更新的吗?

export function setComposition( composition ) {  
  return { type: types.SET_COMPOSITION, composition };
}

export function doStuff() {
  // What I'd like to do:
  dispatch(setComposition).then(() => {
    console.log('done');
  });
}

2 个答案:

答案 0 :(得分:1)

您应该再添加一项操作来检查异步操作是否已完成:

export function setComposition( composition ) {  
  return { type: types.SET_COMPOSITION, composition };
}
export function successComposition() {  
  return { type: types.SET_COMPOSITION_SUCCESS };
}

export function doStuff() {
    // What I'd like to do:
    dispatch(setComposition());
    yourAsyncFunction.then(() => {
    console.log('done');
    dispatch(successComposition());
  });
}

答案 1 :(得分:1)

好问题!使用Redux Thunk是为了确保异步操作(例如通过axios向数据库发出请求)确实将异步处理。

因此,除非您的setComposition操作需要异步,否则您不需要使用thunk。在它是同步的情况下,您可以这样做以查看它何时完成:

dispatch(setComposition( compositionToSet )) //remember to pass in composition instance!
console.log('all done!')

除非您正在编写生产代码并且正在对操作进行批处理,否则上述对redux的更新应该是同步的。

此外,应该注意的是,用于将本地状态更新到组件的this.setState()可以是异步的,当您说状态更新是异步时,这可能是您正在考虑的问题。 / p>