我是Redux的新手,我有一些令人困惑的问题:
1。
The official docs表示,在使用中间件时,每个中间件函数都可以返回新状态对象(next(action)
)之外的其他对象,例如函数或Promise(即使不使用redux-thunk
)。如果是这种情况,以后如何在代码中实现此回调或Promise?只是在dispatch(actionCreater)
之后以链接方式调用它?
在上述情况下,返回的是函数回调而不是对象,那么如何通过链接中间件处理它呢?
2。
第一个问题的扩展,如果有两个以上的中间件,并且有多个中间件返回回调而不是状态,那么这些回调都可以使用吗?我的意思是,要使用它们,只需像dispatch(actionCreater).CALLBACK_NAME()
那样称呼它即可?
如果回调函数的名称偶然相同,该如何处理?
答案 0 :(得分:1)
那如何通过链接中间件处理它?</ p>
我认为链接刚刚停止。例如,从redux-thunk's code看,如果action
是一个函数,则返回该函数的结果,而不会调用next
;因此以下所有中间件均未处理此action
。
我认为这是合乎逻辑的,因为大多数中间件都希望action
是对象而不是函数。如果传递此功能类型的操作,则这些中间件将崩溃。
以后如何在代码中到达此回调或Promise?
我认为您必须在调用dispatch
之后立即处理它,这与您描述的内容差不多。“仅在调度(actionCreater)之后以链接方式调用它。” 。
像redux-thunk
示例一样
dispatch(makeASandwichWithSecretSauce('My partner')).then(() => {
console.log('Done!');
});
如果有两个以上的中间件,并且返回多个中间件 回调而不是状态,这些回调都可以使用吗?
我认为答案是“否”。因为链接已停止。如果某个特殊的中间件处理了任何特殊的action
,则无法通过调用action
来传递该next
,否则特殊操作可能会破坏其他普通的中间件。
所以我想有几种解决方法:
仅使用一种特殊的中间件,因此不会发生冲突。
如果有多个特殊的中间件,则手动组合所有这些中间件,使其成为新的中间件,然后将新的中间件发送到redux
applyMiddleware
中。
使用一些可以处理复杂异步行为的通用/鲁棒中间件,例如redux-saga
。
2的想法可能是这样
const manually = store => next => action => {
if (typeof action === 'function') {
const promise = thunk(action);
const promise2 = anotherThunk(action);
// this is also tricky, because action is a function, you have to make a new object
const whatToPass = {
type: 'what is this', // depends on your need?
// any other data?
};
next(whatToPass); // chaining goes on
// maybe return this, but maybe not good,
// because every promise needs to resolve to trigger the 'then'
return Promise.all([
promise,
promise2,
]);
}
return next(action);
}
答案 1 :(得分:0)
redux中间件将存储作为中间件的参数,您可以使用它来获取状态。您可以使用store.getState()
获取状态。中间件回调结构如下所示。...
const customMiddleware = store => next => action => {
const result = next(action);
console.log("State", store.getState());
console.log("Action", action.type);
return result;
}
其中 store 是Redux存储, next 与store.dispatch
相同, action 是当前执行的操作。< / p>
答案 2 :(得分:0)
我认为this question提出的问题与我差不多。遗憾的是,尚无明确答案。