使用 redux-promise 和 axios 时 Reducer returns 未定义
Reducer returns undefined when using redux-promise and axios
我在 promise 解决后尝试调用回调时遇到了这个问题(使用 .then)事实证明这给了我的 const request 某种形式reducer returns as undefined:
的不同承诺
操作:
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;
}
如您所见,我将来自 API 的数据传递给了 axios 到达我的减速器。在此之后,我设置了状态,我需要调用 'actions' 中的那个回调(它会在组件内部创建另一个动作调用)。不幸的是,我在 reducer const data = action.payload.data 中遇到错误未定义。
当我不使用此回调时,一切正常,但情况是我需要仅在此减速器 returns 新状态后调用该回调。
request
等于整个语句:
const request = axios.get(url)
.then(() => callback())
因此,如果 callback()
没有 return 某事,那么承诺将无效。我假设您正在通过此调用获取一些数据,因此您需要传递该数据,否则您的 reducer 将永远无法获取它。像这样:
const request = axios.get(url)
.then((dataFromRequest) => {
callback();
return dataFromRequest;
});
或者你可以把两者分开写成这样:
const request = axios.get(url);
request.then(() => callback());
return {
type: LOOK_UP,
payload: request,
meta: id
};
比较以下代码段中的承诺:
const promisedData = () => Promise.resolve(42);
promisedData()
.then(data => console.log('Resolved data is ', data));
const promisedTrasformedData = () =>
Promise.resolve(700)
.then(data => data - 34);
promisedTrasformedData()
.then(transformedData => console.log('Transformed data is ', transformedData));
const promisedAndLostData = () =>
Promise.resolve(42)
.then(data => returnNoting())
function returnNoting() { };
promisedAndLostData()
.then(lostData => console.log('Lost data: ', lostData))
在操作中使用另一个回调的最佳方法需要将您的中间件 "redux-promise" 替换为 "redux-thunk"
import ReduxThunk from 'redux-thunk'
const store = createStore(applyMiddleware(ReduxThunk));
操作:
export function lookup(company, callback) {
const id = company.textfield;
const url = `${ROOT_URL}${id}`;
return function(dispatch) {
axios.get(url)
.then((res) => {
dispatch({ type: LOOK_UP, payload: res, meta: id });
callback();
)
};
}
减速器:
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;
}
我在 promise 解决后尝试调用回调时遇到了这个问题(使用 .then)事实证明这给了我的 const request 某种形式reducer returns as undefined:
的不同承诺操作:
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;
}
如您所见,我将来自 API 的数据传递给了 axios 到达我的减速器。在此之后,我设置了状态,我需要调用 'actions' 中的那个回调(它会在组件内部创建另一个动作调用)。不幸的是,我在 reducer const data = action.payload.data 中遇到错误未定义。
当我不使用此回调时,一切正常,但情况是我需要仅在此减速器 returns 新状态后调用该回调。
request
等于整个语句:
const request = axios.get(url)
.then(() => callback())
因此,如果 callback()
没有 return 某事,那么承诺将无效。我假设您正在通过此调用获取一些数据,因此您需要传递该数据,否则您的 reducer 将永远无法获取它。像这样:
const request = axios.get(url)
.then((dataFromRequest) => {
callback();
return dataFromRequest;
});
或者你可以把两者分开写成这样:
const request = axios.get(url);
request.then(() => callback());
return {
type: LOOK_UP,
payload: request,
meta: id
};
比较以下代码段中的承诺:
const promisedData = () => Promise.resolve(42);
promisedData()
.then(data => console.log('Resolved data is ', data));
const promisedTrasformedData = () =>
Promise.resolve(700)
.then(data => data - 34);
promisedTrasformedData()
.then(transformedData => console.log('Transformed data is ', transformedData));
const promisedAndLostData = () =>
Promise.resolve(42)
.then(data => returnNoting())
function returnNoting() { };
promisedAndLostData()
.then(lostData => console.log('Lost data: ', lostData))
在操作中使用另一个回调的最佳方法需要将您的中间件 "redux-promise" 替换为 "redux-thunk"
import ReduxThunk from 'redux-thunk'
const store = createStore(applyMiddleware(ReduxThunk));
操作:
export function lookup(company, callback) {
const id = company.textfield;
const url = `${ROOT_URL}${id}`;
return function(dispatch) {
axios.get(url)
.then((res) => {
dispatch({ type: LOOK_UP, payload: res, meta: id });
callback();
)
};
}
减速器:
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;
}