Flux - 在 Store 注册之前调度的操作

Posted

技术标签:

【中文标题】Flux - 在 Store 注册之前调度的操作【英文标题】:Flux - Actions being dispatched before Store register 【发布时间】:2016-06-13 16:43:14 【问题描述】:

我正在构建一个使用通量作为模式的应用程序。 我试图在进行 API 调用时添加一个加载器(微调器),但它不起作用,我想我错过了一些东西。 流程是这样的: 加载应用程序时,我正在调用 initApp

var InitActions = 
initApp: function()
    FooActions.getFoo();
;
module.exports = InitActions;

FooActions 调度 GET_FOO Action 并调用 APIService.foo.getFooByUser

var FooActions = 

getFoo: function()
    var account = accountStore.getAccountData();
    var accountId = account.id;
    Dispatcher.dispatch(
        actionType: ActionTypes.GET_FOO
    );
   APIService.foo.getFooByUser(accountId);
;
module.exports = FooActions;

APIService 将进行 ajax 调用,并在响应中触发 ServerActions.getFooSuccess 或 ServerActions.getFooFailed 操作

var APIService = 
    foo: 
       getFooByUser : function(accountId)

        var url = apiUrl;
        var params = 
            "accountId":accountId
        ;
       promise.post(url,params)
           .then(function(response)
                ServerActions.getFooSuccess(response);
            )
           .catch(function(response)
                ServerActions.getFooFailed(response);
            );
        
    
; 
module.exports = APIService;

ServerActions 将调度 GET_FOO_SUCCESS 或 GET_FOO_Failed

var ServerActions = 
getFooSuccess: function(response)
    Dispatcher.dispatch(
        actionType: ActionTypes.GET_FOO_SUCCESS,
        foo: response
    );
,

getFooFailed: function(response)
    Dispatcher.dispatch(
        actionType: ActionTypes.GET_FOO_FAILED
    );


而 foo 存储正在通过 dispatcher.register 监听这些事件

var FooStore = assign(, EventEmitter.prototype,...;
Dispatcher.register(function(action)
switch (action.actionType)
    case ActionTypes.GET_FOO:
        _isLoading = true;
        FooStore .emitChange();
        break;
    case ActionTypes.GET_FOO_SUCCESS:
        _isLoading = false;
        _foo = action.foo;
        FooStore .emitChange();
        break;
    case ActionTypes.GET_FOO_FAILED:
        _isLoading = false;
        FooStore.emitChange();
        break;
    default:
    // do nothing
);

现在,基于 _isLoading 参数,我知道何时在我的 foo 组件中显示和隐藏加载程序。由于某种原因,代码永远不会到达 GET_FOO 案例,尽管此操作是在 API 调用之前调度的。 谁能告诉我为什么?

编辑: 当我调试调度程序的代码时,我可以在调度函数中看到循环

Dispatcher.prototype.dispatch = function dispatch(payload) 
    !!this._isDispatching ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.') : invariant(false) : undefined;
    this._startDispatching(payload);
    try 
      for (var id in this._callbacks) 
        if (this._isPending[id]) 
          continue;
        
        this._invokeCallback(id);
      
     finally 
      this._stopDispatching();
    
  ;

我可以看到 FooStore 尚未注册为调度程序回调。 如何确保在触发任何操作之前它已被注册?

【问题讨论】:

【参考方案1】:

已解决: 在我打电话给initApp() 之前,我需要它来确保 FooStore 在任何阳离子之前被注册

【讨论】:

以上是关于Flux - 在 Store 注册之前调度的操作的主要内容,如果未能解决你的问题,请参考以下文章

[Redux/Mobx] redux和flux的区别是什么?

调度程序没有在开玩笑的单元测试中注册回调

为啥我们需要 Flux 中的调度程序?

Flux

错误:不变违规:Store.__emitChange():必须在调度时调用

react/flux- 子组件用户事件 - 一切都应该通过调度程序路由吗