Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.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 如何等待从一个商店到另一个商店的发货_Javascript_Reactjs_Ecmascript 6_Flux - Fatal编程技术网

Javascript 如何等待从一个商店到另一个商店的发货

Javascript 如何等待从一个商店到另一个商店的发货,javascript,reactjs,ecmascript-6,flux,Javascript,Reactjs,Ecmascript 6,Flux,我正在使用Facebook的Flux,react,ES6 我对那些单身商店有不同的问题。然而,反复出现的问题如下。我从一个组件发送一个操作,我有两个存储(StoreA,StoreB)监听该操作 我的两个存储在两个不同的文件中,在每个文件中,我导出singleton存储实例。这两个存储已经导入到它们的相关容器(React组件视图)中。我希望StoreA在StoreA中启动流程之前,等待StoreB完成当前分派的处理 我已经阅读了文档,有一个waitFor方法可以与register方法从dispat

我正在使用Facebook的Flux,react,ES6

我对那些单身商店有不同的问题。然而,反复出现的问题如下。我从一个组件发送一个操作,我有两个存储(StoreA,StoreB)监听该操作

我的两个存储在两个不同的文件中,在每个文件中,我导出singleton存储实例。这两个存储已经导入到它们的相关容器(React组件视图)中。我希望StoreA在StoreA中启动流程之前,等待StoreB完成当前分派的处理

我已经阅读了文档,有一个waitFor方法可以与register方法从dispatcher返回的令牌一起使用。但是,我的两个存储在不同的文件中。找不到从StoreA访问StoreB的调度令牌的方法

换言之:

ReactComp.js

...
handleClick() {
    dispatcher.dispatch({
        type: 'ACTION1'
    });
}
StoreA.js

class StoreA {
    constructor() {
        this.dispatchToken = dispatcher.register((action) => {
            switch(action.type) {
                case 'ACTION1':
                    // do something...
                    break;
            }
        });
    }
}

export default new StoreA();
StoreB.js

class StoreB {
    constructor() {
        dispatcher.register((action) => {
            switch(action.type) {
                case 'ACTION1':
                    dispatcher.waitFor([storeADispatchToken]); //how to get the dispatchToken from Store A... 
                    break;
            }
        });
    }
}

export default new StoreB();

我不熟悉react和flux体系结构,如果答案是显而易见的,那么我会感到抱歉,但是,由于我花了很多时间寻找答案,我打赌答案是不成功的。

将StoreA导入StoreB,您应该能够引用令牌:

import StoreA from 'path/to/StoreA.js';
// or if you're not using es6 imports:
// const StoreA = require('path/to/StoreA.js');

class StoreB {
  constructor() {
    dispatcher.register((action) => {
      switch(action.type) {
        case 'ACTION1':
          dispatcher.waitFor([StoreA.dispatchToken]);
          break;
        }
    });
  }
}

export default new StoreB();

很抱歉,我没有提到这两个存储文件已经导入到各自的组件文件中。如果我这样做,如果我理解正确,我会复制StoreA,对吗?我可能会得到我在组件中使用的上一个实例和我在StoreB中导入的那个实例。两者都将侦听相同的操作,这可能会导致重复Ajax调用和其他逻辑。如果我正确理解您的担忧,答案是否定的-每个存储只有一个实例,因为您正在从存储文件导出一个实例,而不是类-
导出默认的新存储a()-关键在于使用
新的
。当您
从'path/to/StoreA'
导入StoreA时,StoreB和任何使用StoreA的组件都将获得相同的实例。是的,这是我关心的问题,但我有办法解决吗?在我看来,每个文件有一个存储区是合乎逻辑的。但是因为Flux是关于单例存储的,如果我的存储导入到不同的文件中,我就无法访问这些分派令牌。我发现我的自调度操作在有效负载中包含相对存储的dispatch令牌。不要认为这是处理通量模式的正确方法。如果我有一个文件stores.js,文件中的某处有:new StoreA()和new StoreB(),并导出默认值{StoreA:StoreA,StoreB:StoreB},该怎么办?谢谢你的帮助!安德里亚,我想你误解了我的回答-你不需要想办法解决它-听起来你好像误解了出口的工作原理。由于您正在导出实例,StoreB和组件都可以在创建StoreA时导入StoreA,并且都将获得相同的单个实例,因此,不必担心重复的操作侦听器或逻辑,因为该实例只创建了一次,并且是共享的。确实,就您直接从组件分派操作的方式而言,您当前的实现不是很“流畅”——通常的方法不是让组件直接分派,但是要通过action creators实现这一点,请看一看Facebook flux demo Github项目,看看他们是如何构建它的,以便只通过actions目录中的模块发送操作的-