使用ES生成器渲染React组件

时间:2017-04-27 21:12:45

标签: javascript reactjs asynchronous ecmascript-6 generator

我有一个非常基本的睡眠函数实现,可以在x毫秒之后解析一个承诺:

module.exports = (ms) => new Promise(res => setTimeout(res, ms));

然后,我需要在睡眠后在ES6有状态类组件中呈现一个React组件,但这会遗漏错误:Objects are not valid as a React child。这个生成器实现有什么问题吗?

import sleep from './sleep';
class Dummy extends React.Component {

  *renderSubComponent(arg) {
    yield sleep(1000);
    return (<ChildComponent {...arg} />);
  }

  render() {
    return (
     {this.props.check ? this.renderSubComponent(this.props.check).next() : null}
    );
  }

}

我不能使用async / await。

1 个答案:

答案 0 :(得分:1)

基本上,你不能进行这个实现,因为生成器返回一个迭代器,如果没有编程迭代,那么什么都不会发生。

更合理的解决方案是使用组件的状态,这样你就可以将状态保持在同一个组件中,然后你可以改变它

这是组件的外观

$log = ($MyInvocation.MyCommand.Path).TrimEnd("ps1") + "log"
$handlelog = ($MyInvocation.MyCommand.Path).TrimEnd(".ps1") + "-Handle.log"
$1 = gci 'Z:\SQLBackups' | %{gci $_.fullname -Filter '*.BAK' | ? {$_.LastWriteTime -le (get-date).addhours(-22)}}
write-output "$(get-date -format g) Files will be deleted: $1" >> $log
$1 | % {remove-item $_.fullname -force -Confirm:$FALSE}
if (!!($error)) {
write-output "$(get-date -format g) Open Handles on .BAK files:" >> $handlelog
$exec = "$env:SystemRoot\system32\cmd.exe /c" + (Split-Path($MyInvocation.MyCommand.Path)) + "\handle64.exe .BAK -u -nobanner -accepteula"
Invoke-Expression -Command:$exec >> $handlelog
$error >> $log
}