在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
相关产品推荐
相关产品推荐

