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

在JavaScript/AngularJS中如何在同一返回语句返回两种不同内容?

如何让你的getData服务返回两种不同内容

嘿,这个问题其实很好解决!因为你的getData方法返回的是一个Promise,我们可以利用Promise的then和catch分支,分别返回不同结构的内容——不管是让成功/失败都通过resolve返回,还是保持传统的resolve/reject分治,都能实现“同一返回语句(Promise)返回两种不同内容”的需求。

下面给你两种实用的方案:

方案一:统一返回带状态标识的对象(成功失败都resolve)

这种方案会让Promise始终进入resolved状态,调用方只需要在then里判断结果的状态即可,适合不想区分then/catch的场景:

getData(siteId) {
  const accessToken = JSON.parse(sessionStorage.getItem('ls.authorizationData')).token;
  const config = { /* 你的原有配置 */ };
  this.canceler.resolve();
  this.canceler = this.$q.defer();
  config.timeout = this.canceler.promise;
  const siteIds = this.MyService.getSitesIds();
  
  return this.$http.get(`${TEST_API_URL}value?siteIds=${siteId || siteIds}`, config)
    .then(result => {
      // 成功时返回带成功标识和数据的对象
      return {
        success: true,
        data: result.data,
        timestamp: Date.now() // 可以额外加一些有用的字段
      };
    }).catch((e) => {
      // 失败时返回带失败标识和错误信息的对象
      return {
        success: false,
        errorMessage: e.message || '数据获取失败',
        originalError: e, // 保留原始错误方便排查
        requestedSiteIds: siteId || siteIds
      };
    });
}

调用示例:

getData(123)
  .then(result => {
    if (result.success) {
      console.log('拿到数据:', result.data);
    } else {
      console.error('出错了:', result.errorMessage);
    }
  });

方案二:保持Promise的resolve/reject语义(成功返回数据,失败返回自定义错误)

这种方案更符合Promise的设计规范,成功时通过resolve返回数据,失败时通过reject抛出自定义错误对象,调用方用then处理成功,catch处理失败:

getData(siteId) {
  const accessToken = JSON.parse(sessionStorage.getItem('ls.authorizationData')).token;
  const config = { /* 你的原有配置 */ };
  this.canceler.resolve();
  this.canceler = this.$q.defer();
  config.timeout = this.canceler.promise;
  const siteIds = this.MyService.getSitesIds();
  
  return this.$http.get(`${TEST_API_URL}value?siteIds=${siteId || siteIds}`, config)
    .then(result => {
      // 成功返回业务数据结构
      return {
        data: result.data,
        siteIds: siteId || siteIds
      };
    }).catch((e) => {
      // 失败时reject一个包含上下文信息的自定义错误对象
      const customError = {
        type: 'DATA_FETCH_ERROR',
        message: `获取站点${siteId || siteIds}的数据失败`,
        originalError: e,
        timestamp: Date.now()
      };
      // 用$q.reject抛出,让调用方的catch能捕获到
      return this.$q.reject(customError);
    });
}

调用示例:

getData(123)
  .then(dataResult => {
    console.log('成功拿到数据:', dataResult.data);
  })
  .catch(error => {
    console.error('错误类型:', error.type);
    console.error('错误信息:', error.message);
  });

关键说明

  • 本质上,你的getData返回的是一个Promise对象,所谓“同一返回语句返回两种不同内容”,就是让这个Promise在resolved和rejected状态下携带不同的payload,或者在resolved状态下根据请求结果返回不同结构的对象。
  • 如果你不想改变原有调用方的then-catch结构,方案二更合适;如果想简化调用逻辑,让调用方只处理then,方案一更友好。

内容的提问来源于stack exchange,提问作者Leo Messi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:21:47