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

The deferred antipattern, how to handle rejects?

我明白什么是The deferred antipattern, also mentioned as "The Forgotten Promise" HERE

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

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

但我不明白如何处理我得到响应的情况,我需要拒绝它,因为它没有正确的密钥。

这是我在服务中returns向控制器承诺的方法。

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

你有两个选择。

您可以 return 发自内心的拒绝承诺:

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