如何从 thunk promise 正确调用 thunk 函数?
How to properly call a thunk function from a thunk promise?
我有一个 Delete 函数,它使用 Thunk 首先通过 CALL_API 中间件调度一个 DELETE 操作,当承诺被解析时,它调度一个 GET 操作。
下面的代码成功执行了预期的行为。
export const deleteShops = (shopId) => (dispatch, getState) => {
let endpoint = `stores/${shopId}`;
console.log('endpoint a enviar: ',endpoint)
return dispatch({
[CALL_API]: {
// las acciones que ejecuta el middleware en loading, success y error.
method: 'PATCH',
types: [ SHOPS_DELETE_LOADING, SHOPS_DELETE_SUCCESS, SHOPS_DELETE_ERROR ],
endpoint: endpoint,
body: {
"status" : "INACTIVE"
},
schema: Schemas.USER // TODO: create a Schema for this
}
}).then((res) => {
console.log('termino el delete con respuesta: ', res);
console.log('el state es: ', getState());
let page = getState().shops.data.page.number;
let pageSize = getState().shops.data.page.size;
let endpoint = `stores/search/advancedSearch?page=${page}&size=${pageSize}&projection=storeProjection`;
//getShops({page:page, pageSize:pageSize, filtered:[], sorted:[]})();
return dispatch({
[CALL_API]: {
// las acciones que ejecuta el middleware en loading, success y error.
method: 'GET',
types: [ SHOPS_GET_LOADING, SHOPS_GET_SUCCESS, SHOPS_GET_ERROR ],
endpoint: endpoint,
schema: Schemas.USER
}
})
})
}
我想做的是传递另一个 Thunk 函数而不是调度,以避免代码重复。这是我要传递给 promise 的操作。
export const getShops = (state, instance) => (dispatch, getState) => {
let endpoint = `stores/search/advancedSearch?page=${state.page}&size=${state.pageSize}&projection=storeProjection`;
// more endpoint forming code here, not relevant
// endpoint
console.log('endpoint a enviar: ',endpoint)
return dispatch({
[CALL_API]: {
// las acciones que ejecuta el middleware en loading, success y error.
method: 'GET',
types: [ SHOPS_GET_LOADING, SHOPS_GET_SUCCESS, SHOPS_GET_ERROR ],
endpoint: endpoint,
schema: Schemas.USER // TODO: create a Schema for this
}
})
}
这里是修改后的 deleteShops 操作。
export const deleteShops = (shopId) => (dispatch, getState) => {
let endpoint = `stores/${shopId}`;
console.log('endpoint a enviar: ',endpoint)
return dispatch({
[CALL_API]: {
// las acciones que ejecuta el middleware en loading, success y error.
method: 'PATCH',
types: [ SHOPS_DELETE_LOADING, SHOPS_DELETE_SUCCESS, SHOPS_DELETE_ERROR ],
endpoint: endpoint,
body: {
"status" : "INACTIVE"
},
schema: Schemas.USER // TODO: create a Schema for this
}
}).then((res) => {
console.log('termino el delete con respuesta: ', res);
console.log('el state es: ', getState());
let page = getState().shops.data.page.number;
let pageSize = getState().shops.data.page.size;
let endpoint = `stores/search/advancedSearch?page=${page}&size=${pageSize}&projection=storeProjection`;
getShops({page:page, pageSize:pageSize})();
})
}
当我进行删除时,我进入 Chrome 的控制台:
Uncaught (in promise) TypeError: dispatch is not a function
at shops.js:47
at shops.js:83
at <anonymous>
我的理解是 Thunk 没有将调度方法传递给 getShops。链接这些操作的正确方法是什么?
这里是调度函数而不是动作的 deleteShops 函数。请注意最后一部分,我没有执行 getShops 函数,而是将其传递给 dispatch。 Thunk 中间件从那里获取它。
export const deleteShops = (shopId) => (dispatch, getState) => {
let endpoint = `stores/${shopId}`;
console.log('endpoint a enviar: ',endpoint)
return dispatch({
[CALL_API]: {
// las acciones que ejecuta el middleware en loading, success y error.
method: 'PATCH',
types: [ SHOPS_DELETE_LOADING, SHOPS_DELETE_SUCCESS, SHOPS_DELETE_ERROR ],
endpoint: endpoint,
body: {
"status" : "INACTIVE"
},
schema: Schemas.USER // TODO: create a Schema for this
}
}).then((res) => {
console.log('termino el delete con respuesta: ', res);
console.log('el state es: ', getState());
let page = getState().shops.data.page.number;
let pageSize = getState().shops.data.page.size;
dispatch(getShops({page:page, pageSize:pageSize, sorted:[], filtered:[]}));
})
}
我有一个 Delete 函数,它使用 Thunk 首先通过 CALL_API 中间件调度一个 DELETE 操作,当承诺被解析时,它调度一个 GET 操作。
下面的代码成功执行了预期的行为。
export const deleteShops = (shopId) => (dispatch, getState) => {
let endpoint = `stores/${shopId}`;
console.log('endpoint a enviar: ',endpoint)
return dispatch({
[CALL_API]: {
// las acciones que ejecuta el middleware en loading, success y error.
method: 'PATCH',
types: [ SHOPS_DELETE_LOADING, SHOPS_DELETE_SUCCESS, SHOPS_DELETE_ERROR ],
endpoint: endpoint,
body: {
"status" : "INACTIVE"
},
schema: Schemas.USER // TODO: create a Schema for this
}
}).then((res) => {
console.log('termino el delete con respuesta: ', res);
console.log('el state es: ', getState());
let page = getState().shops.data.page.number;
let pageSize = getState().shops.data.page.size;
let endpoint = `stores/search/advancedSearch?page=${page}&size=${pageSize}&projection=storeProjection`;
//getShops({page:page, pageSize:pageSize, filtered:[], sorted:[]})();
return dispatch({
[CALL_API]: {
// las acciones que ejecuta el middleware en loading, success y error.
method: 'GET',
types: [ SHOPS_GET_LOADING, SHOPS_GET_SUCCESS, SHOPS_GET_ERROR ],
endpoint: endpoint,
schema: Schemas.USER
}
})
})
}
我想做的是传递另一个 Thunk 函数而不是调度,以避免代码重复。这是我要传递给 promise 的操作。
export const getShops = (state, instance) => (dispatch, getState) => {
let endpoint = `stores/search/advancedSearch?page=${state.page}&size=${state.pageSize}&projection=storeProjection`;
// more endpoint forming code here, not relevant
// endpoint
console.log('endpoint a enviar: ',endpoint)
return dispatch({
[CALL_API]: {
// las acciones que ejecuta el middleware en loading, success y error.
method: 'GET',
types: [ SHOPS_GET_LOADING, SHOPS_GET_SUCCESS, SHOPS_GET_ERROR ],
endpoint: endpoint,
schema: Schemas.USER // TODO: create a Schema for this
}
})
}
这里是修改后的 deleteShops 操作。
export const deleteShops = (shopId) => (dispatch, getState) => {
let endpoint = `stores/${shopId}`;
console.log('endpoint a enviar: ',endpoint)
return dispatch({
[CALL_API]: {
// las acciones que ejecuta el middleware en loading, success y error.
method: 'PATCH',
types: [ SHOPS_DELETE_LOADING, SHOPS_DELETE_SUCCESS, SHOPS_DELETE_ERROR ],
endpoint: endpoint,
body: {
"status" : "INACTIVE"
},
schema: Schemas.USER // TODO: create a Schema for this
}
}).then((res) => {
console.log('termino el delete con respuesta: ', res);
console.log('el state es: ', getState());
let page = getState().shops.data.page.number;
let pageSize = getState().shops.data.page.size;
let endpoint = `stores/search/advancedSearch?page=${page}&size=${pageSize}&projection=storeProjection`;
getShops({page:page, pageSize:pageSize})();
})
}
当我进行删除时,我进入 Chrome 的控制台:
Uncaught (in promise) TypeError: dispatch is not a function
at shops.js:47
at shops.js:83
at <anonymous>
我的理解是 Thunk 没有将调度方法传递给 getShops。链接这些操作的正确方法是什么?
这里是调度函数而不是动作的 deleteShops 函数。请注意最后一部分,我没有执行 getShops 函数,而是将其传递给 dispatch。 Thunk 中间件从那里获取它。
export const deleteShops = (shopId) => (dispatch, getState) => {
let endpoint = `stores/${shopId}`;
console.log('endpoint a enviar: ',endpoint)
return dispatch({
[CALL_API]: {
// las acciones que ejecuta el middleware en loading, success y error.
method: 'PATCH',
types: [ SHOPS_DELETE_LOADING, SHOPS_DELETE_SUCCESS, SHOPS_DELETE_ERROR ],
endpoint: endpoint,
body: {
"status" : "INACTIVE"
},
schema: Schemas.USER // TODO: create a Schema for this
}
}).then((res) => {
console.log('termino el delete con respuesta: ', res);
console.log('el state es: ', getState());
let page = getState().shops.data.page.number;
let pageSize = getState().shops.data.page.size;
dispatch(getShops({page:page, pageSize:pageSize, sorted:[], filtered:[]}));
})
}