最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to bubble error correctly from Promise without throw? - Stack Overflow

programmeradmin1浏览0评论

I have the following TypeScript method which returns a promise:

public loadSavedLogin(): ng.IPromise<MyApp.Models.User> {
   return this._myAppService.getUser(this.savedUserId).then((result: MyApp.Models.User) => {
       if (result) {
          this.userId = result.UserID;
          this.userName = result.UserName;
        }
        return result;
     }, (error) => {
           this._isAuthError = true;
           return  error;
     }
  );
}

The problem I have is in the promise's error callback. The upstream calls to this method also rely on a promise so if the error does not bubble up correctly, the upstream promise doesn't function correctly. I found a hackish solution:

(error) => {

      try {
             this._isAuthError = true;
             return error;
           } catch (e) {
              //If any error occurred above make sure to still throw
              throw error;
           } finally {
                //Allow upstream promises to continue as expected
                throw error;
           }
 }

This works but looks, feels, and is probably all wrong. I feel like I'm missing a proper implementation when handling and bubbling errors in a promise. There has to be a more proper/correct way of handling the error function in this promise as I've done, and yet still allow upstream promise's making a call to this method to work properly as well when handling their own error function.

How do I get the error to bubble without the series of hackish throw statements?

Note: It seems redundant to return the error and throw as well, but the IPromise interface I'm using will not pile if I don't return a value. This is why I return and throw the error.

Note: I read a ton of the questions on handling errors with promises, but none of them are answering the question as I'm asking in regards to preventing the hackish approach I've taken.

I have the following TypeScript method which returns a promise:

public loadSavedLogin(): ng.IPromise<MyApp.Models.User> {
   return this._myAppService.getUser(this.savedUserId).then((result: MyApp.Models.User) => {
       if (result) {
          this.userId = result.UserID;
          this.userName = result.UserName;
        }
        return result;
     }, (error) => {
           this._isAuthError = true;
           return  error;
     }
  );
}

The problem I have is in the promise's error callback. The upstream calls to this method also rely on a promise so if the error does not bubble up correctly, the upstream promise doesn't function correctly. I found a hackish solution:

(error) => {

      try {
             this._isAuthError = true;
             return error;
           } catch (e) {
              //If any error occurred above make sure to still throw
              throw error;
           } finally {
                //Allow upstream promises to continue as expected
                throw error;
           }
 }

This works but looks, feels, and is probably all wrong. I feel like I'm missing a proper implementation when handling and bubbling errors in a promise. There has to be a more proper/correct way of handling the error function in this promise as I've done, and yet still allow upstream promise's making a call to this method to work properly as well when handling their own error function.

How do I get the error to bubble without the series of hackish throw statements?

Note: It seems redundant to return the error and throw as well, but the IPromise interface I'm using will not pile if I don't return a value. This is why I return and throw the error.

Note: I read a ton of the questions on handling errors with promises, but none of them are answering the question as I'm asking in regards to preventing the hackish approach I've taken.

Share Improve this question asked Nov 5, 2014 at 5:31 atconwayatconway 21.3k32 gold badges165 silver badges237 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 6

I am not conversant with TypeScript, but here is a javascript solution, where you use $q.reject

.then(function() {}, 
      function(error) {
          this._isAuthError = true; 
          return $q.reject(error); 
      });`

Just throw the error instead of ever returning it:

public loadSavedLogin(): ng.IPromise<MyApp.Models.User> {
   return this._myAppService.getUser(this.savedUserId).then((result: MyApp.Models.User) => {
       if (result) {
          this.userId = result.UserID;
          this.userName = result.UserName;
        }
        return result;
     }, (error) => {
           this._isAuthError = true;
           throw  error;
     }
  );
}

Note that a valid return (i.e. not returning a promise / rejected promise) from a rejection handler makes the next promise in the chain fulfilled.

发布评论

评论列表(0)

  1. 暂无评论