当您调用动作创建者(动作创建者函数的第一行之一)时,您会发出 ajax 请求。那是一个网络请求,它将到达那个 JSON API。
要理解的关键部分是,当我们发出请求时,我们会进入下一行代码,在其中形成该操作对象并返回它。这两个步骤之间的时间,即发出请求和返回操作之间的时间是瞬时的。
众所周知,每当我们向某个外部 API 发出网络请求时,可能需要一些时间才能得到响应。
因此,在我们从动作创建者返回动作之后,在未来的某个时间,我们会从 JSON API 获得响应。
因此,在发出 Ajax 请求和从动作创建者返回的动作之间可能是瞬时的,但是从动作创建者返回的动作和收到来自 JSON API 的响应之间的时间可能需要更长的时间。
无论花费多长时间,当 action 出现在 reducer 中时,它总是可以从我们的 API 中获得我们的数据。
为了给你一个更好的主意,我debugger
在我自己的一个 reducer 中添加了一个语句,这样我们就可以查看其中的不同值。
import { SAVE_COMMENT, FETCH_COMMENTS } from 'actions/types';
export default function(state = [], action) {
switch (action.type) {
case SAVE_COMMENT:
return [...state, action.payload];
case FETCH_COMMENTS:
debugger;
const comments = action.payload.data.map(comment => comment.name);
return [...state, ...comments];
default:
return state;
}
}
当我单击 Fetch Comments 按钮时,它调用了动作创建者,在我的源选项卡中,我立即点击了该debugger
语句。
这里有证据表明,每当这个动作出现在 reducer 中时,它都有从 API 获得的响应。
现在,让我们移除 Redux Promise 中间件,看看会发生什么。
中间件:
export default ({ children, initialState = {} }) => {
const store = createStore(
reducers,
initialState,
applyMiddleware(reduxPromise)
);
中间件不见了:
export default ({ children, initialState = {} }) => {
const store = createStore(reducers, initialState, applyMiddleware());
return <Provider store={store}>{children}</Provider>;
};
这是什么?
payload
不是从 JSON API 返回的响应,而是一个 pending ,Promise
这意味着我们的请求仍在网络上等待从 JSON API 返回。很明显,如果没有 Redux Promise 中间件,我们的应用程序将无法按预期工作。
动作创建者不是为了支持异步请求而开发的,称之为疏忽,我不知道。
我们使用像 Redux Promise 这样的中间件来查看即将发送到 reducer 的操作,我们有机会完全延迟、记录、修改或停止操作,并且只有通过这些中间件,我们才能使这些异步请求以这种方式工作我们期望它。我们使用 Redux Promise 是因为我们想要检查从动作创建者返回的每个动作,如果它包含 API 请求或一些异步请求,我们想要延迟它,这样我们就可以在动作继续之前得到响应返回减速机。这就是 Redux Promise 为我们所做的。