React Flux - 来自通量调度器/存储器的返回值

时间:2015-11-29 20:08:54

标签: reactjs typescript dependencies promise flux

我正在使用flux-patternflux dispatcher。我需要在创建一个新的TextItem后将一个值从'TextStore'返回到一个动作,因为我需要在另一个商店中引用它。 这是我想要做的非常简单的版本:

// stores.ts
var TextStore = {
    add(){
        // here I want to return a new ID
        return createRandomID();
    }
    ...
}
var ModuleStore = {
    labelTextID; // refers to `id` on Text
    ...
}


// moduleactions.ts
...
import PageActions from './PageActions';
var ModuleActions = {
    add: function (module) {
        var textID = PageActions.add(); // here I need to get the ID of the newly create `Text`
        module.labelTextID = textID;
        Dispatcher.dispatch({
            action: 'ADD_MODULE',
            module: module
        })
    },
    ...
}

现在,当我通过调度操作添加新的Module时,我想创建一个新的Text,然后从商店返回其新创建的ID。

最明显的方法是要求TextStoreModuleActions并直接致电add()。这是否反对通量模式?

有没有办法实现这一点,也许还有承诺?通过调度程序向商店发送回调不起作用,因为我无法在另一个调度未完成时发送。

如果你们能帮助我,那会很棒!

2 个答案:

答案 0 :(得分:2)

直接调用Store的方法是Flux的反模式。如果您直接致电TextStore.add(),那么您没有关注

Action -> Dispatcher -> Store --> View --> Action周期。

无论如何,数据应始终在action 中生成。当生成数据的过程是异步时,这更有意义。在您的情况下,您可以解决这个问题,因为数据的生成不是异步的。您正在TextStore中直接生成数据,然后担心如何返回该值。

在您的情况下,如果是异步后端事件,请在操作中生成id,然后通过调度程序将id传递给TextStore,之后也通过调度程序将相同的ID传递给ModuleStore

var ModuleActions = {
    add: function (module) {
        var textID = new Date().getTime(); // this is the CHANGE i added
        PageActions.add(textID); 
        module.labelTextID = textID;
        Dispatcher.dispatch({
            action: 'ADD_MODULE',
            module: module
        })
    }
}

您还可以将其分解为更小,更具体的操作。我保持原样,所以我可以突出你应该改变的一行。

答案 1 :(得分:0)

  

有没有办法实现这一点,也许还有承诺?通过调度程序向商店发送回调不起作用,因为我无法在另一个调度未完成时发送。

您可以在发送PageActions.add();之前进行异步调用ModuleActions.add,并将返回的值作为参数传递给ModuleActions.add