我正在使用flux-pattern和flux 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。
最明显的方法是要求TextStore
内ModuleActions
并直接致电add()
。这是否反对通量模式?
有没有办法实现这一点,也许还有承诺?通过调度程序向商店发送回调不起作用,因为我无法在另一个调度未完成时发送。
如果你们能帮助我,那会很棒!
答案 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