Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ReactJS-在componentDidMount中等待操作完成_Javascript_Reactjs_Reactjs Flux - Fatal编程技术网

Javascript ReactJS-在componentDidMount中等待操作完成

Javascript ReactJS-在componentDidMount中等待操作完成,javascript,reactjs,reactjs-flux,Javascript,Reactjs,Reactjs Flux,下面是有问题的代码。我在componentDidMount中有一个异步UserActions调用,之后我立即从由该操作填充的UserStore中查找用户信息。显然,我不能依赖定义UserStore.isLargeAccess()。将依赖于回调操作的代码放在回调中是最好的约定,还是我遗漏了一些更大的设计选择 componentDidMount() { this.changeListener = this._onChange.bind(this); UserStore.addChan

下面是有问题的代码。我在
componentDidMount
中有一个异步
UserActions
调用,之后我立即从由该操作填充的
UserStore
中查找用户信息。显然,我不能依赖定义
UserStore.isLargeAccess()
。将依赖于回调操作的代码放在回调中是最好的约定,还是我遗漏了一些更大的设计选择

componentDidMount() {
    this.changeListener = this._onChange.bind(this);
    UserStore.addChangeListener(this.changeListener);
    OrganizationStore.addChangeListener(this.changeListener);

    // Fetch user info
    UserActions.get(AuthStore.username);

    // UserStore.isLargeAccess() is undefined here,
    // because the previous action has not finished.
    if (UserStore.isLargeAccess()) {
      OrganizationActions.getUsers(this.state.organization);
    }

    if (UserStore.isGlobalAccess()) {
      OrganizationActions.getOrganizations();
    }
  }
它应该如何工作(如果我理解您的流程):

  • 您应该为每个存储注册不同的回调(否则您不知道哪个存储发出事件)
  • 开始一些异步工作
  • 当异步工作完成后,它将使用异步工作中的一些数据来分派操作
  • 您的存储区UserStore和OrganizationStore侦听此操作,当它们收到此操作时,会执行一些工作并发出更改
  • 当它们发出更改时,就会从组件中调用回调。在每个回调中,您知道哪个存储调用它,因此您知道从哪个存储获取数据

  • 在#1中,通过注册不同的回调,您的意思是添加不同的更改侦听器吗?也就是说,这一行:
    UserStore.addChangeListener(this.changeListener)?是的,我是认真的。这不是必需的,但它有助于并使您的模块流程更清晰。嗯。。。我将代码更改为以下内容。首先,我调用
    UserAction
    来填充
    UserStore
    。假设我注册了一个回调来观察
    UserStore
    中的更改,一旦
    UserStore
    发出更改,我就会调用
    OrganizationAction
    。但是,这引发了以下错误:“不能在调度的中间发送。”我应该在这个问题中添加我的新代码吗?