【发布时间】:2018-02-21 08:14:15
【问题描述】:
当我在 promise 解决后尝试调用回调时遇到了这个问题(使用 .then)事实证明,这给了我的 const request 某种与 reducer 不同的 promise返回未定义:
行动:
export function lookup(company, callback) {
const id = company.textfield;
const url = `${ROOT_URL}${id}`;
const request = axios.get(url)
.then(() => callback())
return {
type: LOOK_UP,
payload: request,
meta: id
};
}
减速器:
import { LOOK_UP } from '../actions/index';
export default function(state = {}, action) {
switch (action.type) {
case LOOK_UP:
const data = action.payload.data;
const id = action.meta;
if (data.Success === true) {
return { ...state, [id]: data.CompanyInformation };
} else {
return state;
}
}
return state;
}
如您所见,我将 axios 获取的 API 中的数据传递给我的 reducer。在此之后,我设置了状态,我需要调用“actions”中的回调(它会在组件内创建另一个动作调用)。不幸的是,我得到了一个错误,即 reducer const data = action.payload.data 是未定义的。
当我不使用此回调时,一切正常,但情况是我需要仅在此 reducer 返回新状态后调用该回调。
【问题讨论】:
-
有什么进展吗?你有时间尝试我的建议吗?
-
我现在看到了,这次调用了回调,但我认为这里的问题是它被触发得太早了。我的意思是,这个回调通过这个 LOOK_UP 操作传递从 reducer 返回的新状态。我必须创建另一个函数,该函数将在此状态更改后启动,而不仅仅是在 promise 解决时启动。
-
回调真的依赖于新的状态,还是仅仅依赖于
request = axios.get(url)的返回?如果只是回调需要响应作为参数,那么您可以简单地使用我的第一个建议,但使用callback(dataFromRequest);或callback(dataFromRequest.data);或您感兴趣的任何信息。您还可以包含 if 语句。等等,如果dataFromRequest.data.SUCESS !== true,则执行Promise.reject( )。 -
你使用什么库来实现承诺?你有标签
redux-promise。是这个吗? github.com/acdlite/redux-promise 那里的例子太少了,很难看出它应该如何使用。是redux-promise添加了.Success吗? -
是的,我正在使用 redux-promise,但是 .Success 来自 API(此 api 返回带有 data/null 和 Success true/false 的对象)。所以我认为最合理的做法是在这种情况下将回调与从请求返回的 dataFromRequest 一起使用。但我想对于我的减速器,我仍然需要返回类型为:LOOK_UP、有效负载:请求等的部分?
标签: javascript promise redux axios redux-promise