有一个服务可以获取数据,并具有一个捕获结构:
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,
};
}).catch((e) => {
if (e.status === -1 && e.xhrStatus === "abort") {
return Promise.resolve({canceled: true});
}
debugger;
this.hasData = false;
return Promise.reject('Cannot access data ');
});
}
我是从控制器调用此函数,最初是$onInit()
,如下所示:
$onInit() {
getData.call(null, this);
}
并作为一个功能:
function getData(MyCtrl) {
MyCtrl.loading = true;
MyCtrl.MyService.getData(MyCtrl.siteId).then(result => {
if (result.canceled) {
return;
}
...
}
这很好用。
当我想将数据从服务发送到控制器时,如果没有数据(如果发生catch()
),则会出现问题。
我试图通过将Promise包装在像
这样的对象中来改变返回 return {promise: Promise.reject('Cannot access data ')};
并在此对象中添加变量:
return {promise: Promise.reject('Cannot access data ')
hasData: false};
但似乎这不是正确的方法。我需要知道控制器中是否有数据。
您对如何解决这个问题有什么建议吗?
答案 0 :(得分:1)
通常,当你想从Promise拒绝中返回更多数据时,你可以像从普通异常中返回一样,从Error对象扩展。
这是一个例子..
class MyError extends Error {
constructor (message, extra) {
super(message);
this.extra = extra;
}
}
//standard promise rejection way.
function badPromise() {
return Promise.reject(
new MyError("Bad Error", "Extra Stuff")
);
}
//works if throw error inside an async function
async function badPromise2() {
throw new MyError("Bad Error2", "Extra Stuff2");
}
async function test() {
try {
if (Math.random() > 0.5) await badPromise();
else await badPromise2();
} catch(e) {
if (e instanceof MyError) {
console.error(`${e.message}, extra = ${e.extra}`);
} else {
console.error(`${e.toString()}`);
}
}
}
test();
PS。这是使用新的ESNext功能,但同样适用于ES5 ..