在JavaScript / AngularJS中的同一返回内返回两个不同的东西

时间:2018-03-27 09:06:46

标签: javascript angularjs promise

有一个服务可以获取数据,并具有一个捕获结构:

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};

但似乎这不是正确的方法。我需要知道控制器中是否有数据。

您对如何解决这个问题有什么建议吗?

1 个答案:

答案 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 ..