You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:18:20