如何修改JS函数中Promise返回的响应结构后再返回?
问题说明
我有如下JavaScript函数:
import service from "services/catalogs"; export const getPaginatedAdminPublications = async (params: URLSearchParams) => { params.delete("sort"); const searchParams = new URLSearchParams(params.get("search")); if (searchParams) { const publicationId = searchParams.get("id"); publicationId && params.append("ids[]", publicationId); params.delete("search"); params.delete("id"); } return service.getPaginatedAdminPublications(params); };
该函数修改params后,调用一个返回Promise的service方法,该Promise返回的结果结构如下:
{ data: [...], metadata: { page: 1, total_pages: 10 } }
我希望将返回结果修改为如下结构:
{ data: [...], metadata: { page: 1, total_pages: 10 }, pagination: { page: 1, total_pages: 10 } }
我尝试了如下代码但未生效,请问这个实现思路可行吗?
export const getPaginatedAdminPublications = async (params: URLSearchParams) => { params.delete("sort"); const searchParams = new URLSearchParams(params.get("search")); if (searchParams) { const publicationId = searchParams.get("id"); publicationId && params.append("ids[]", publicationId); params.delete("search"); params.delete("id"); } return service.getPaginatedAdminPublications(params).then(data => { return { ...data, pagination: { total: data.data.metadata.total_results, } } }); };
问题分析与修复
你的实现思路是可行的,但代码里存在两处错误导致未生效:
- 属性路径错误:原返回结构里,
metadata直接挂在返回对象上,并非data.data.metadata,正确路径是data.metadata - 目标字段不匹配:你需要的
pagination结构包含page和total_pages,但代码里只写了total,且字段名与需求不符
修复后的代码如下:
export const getPaginatedAdminPublications = async (params: URLSearchParams) => { params.delete("sort"); const searchParams = new URLSearchParams(params.get("search")); // 优化判断:URLSearchParams即使无参数也会返回实例,用toString()判断是否有实际参数更严谨 if (searchParams.toString()) { const publicationId = searchParams.get("id"); publicationId && params.append("ids[]", publicationId); params.delete("search"); params.delete("id"); } return service.getPaginatedAdminPublications(params).then(result => { return { ...result, pagination: { page: result.metadata.page, total_pages: result.metadata.total_pages } }; }); };
如果习惯用async/await写法,也可以改成更直观的版本:
export const getPaginatedAdminPublications = async (params: URLSearchParams) => { params.delete("sort"); const searchParams = new URLSearchParams(params.get("search")); if (searchParams.toString()) { const publicationId = searchParams.get("id"); publicationId && params.append("ids[]", publicationId); params.delete("search"); params.delete("id"); } const result = await service.getPaginatedAdminPublications(params); return { ...result, pagination: { page: result.metadata.page, total_pages: result.metadata.total_pages } }; };
内容的提问来源于stack exchange,提问作者mouchin777
相关产品推荐
相关产品推荐

