延期反模式,如何处理拒绝?

时间:2017-12-09 17:31:21

标签: angularjs angular-promise

我明白什么是The deferred antipattern,也被提及为"被遗忘的承诺" HERE

我还读到:what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it

无论如何我应该试着摆脱使用$q.defer()

但我不明白如何处理我得到回复的案例,我需要拒绝它,因为它没有正确的密钥。

这是我在Service中的方法,它向控制器返回promise。

self.findTime = function(data){

  var deferred = $q.defer();

   apiClient.findTime(data)
      .then(function (response) {

         if (response.result !== "success") {
            deferred.reject(response);
         }

        deferred.resolve(response);
      }
      , function (error) {
      deferred.reject(error);
        console.error(error);
      });

      return deferred.promise;
};

因此我尝试将其更改为:

self.findTime = function(data){      

   return apiClient.findTime(data)
      .then(function (response) {

         if (response.result !== "success") {
            // return WHAT ??? <-------------
         }
        return response;
      }
      , function (error) {
      // return WHAT ??? <-------------
        console.error(error);
   });
};

如何处理reject

在控制器中,拒绝时我会显示一些早晨消息。

 Service.findTime(data).then(function (response) {
   // do something
    }, function (error) {
      // show warn dialog
 });

1 个答案:

答案 0 :(得分:1)

您有两种选择。

您可以在决心内退回拒绝承诺:

return apiClient.findTime(data)
    .then(function (response) {
        if (response.result !== "success") {
            return $q.reject('reason'); // Convert to rejection
        }
        return response;
    }, function (error) {
        console.error(error);
        return $q.reject('reason');  // Chain rejection
    });

或者您可以抛出异常:

return apiClient.findTime(data)
    .then(function (response) {
        if (response.result !== "success") {
            throw new Error('reason');
        }
        return response;
    }, function (error) {
        console.error(error);
        throw new Error(error);
    });