工厂 - 然后和AngularJS中的Catch Promise Chaining

时间:2015-12-21 15:58:27

标签: javascript angularjs web-services promise angular-promise

我遇到了这个棘手的场景,何时将工厂内的承诺链接起来或将其转交给控制器。

同样的几个问题:

  • 哪一个有益?在工厂函数或控制器中编写然后捕获
  • 商业场景
  • Performance Advantage

早些时候我曾经在工厂方法中编写了then和catch链接:

function searchReservations(lastName, arrivalDate)
    {
       // alert(lastName + ' ' + arrivalDate)

          return $http({
          method: 'GET',
          url: baseUrl + '/reservation?lastName='+lastName+'&arrivalDate='+arrivalDate
          })
            **.then(success)
            .catch(failure);**

          function success(response) {
            return response;
          }

          function failure(error) {
            console.log('XHR Failed for searchReservation' + error.data);
            return error;
          }
    }

但是作为一种新的趋势,我看到了然后抓住了在控制器功能中写的两个。有点像这样。

HRS.searchReservations(this.searchLastName, arrivalDate).then(function(response) {
...
}).catch(function(response){
...
})

更具体地说,关于商业案例和业绩优势,我想知道这里的不同之处。

谢谢, ANKIT

1 个答案:

答案 0 :(得分:1)

我使用第一个。我觉得它更干净,更容易阅读,并且允许您为方法命名,以增加清晰度。

在服务中,我的成功和错误函数将响应数据转换为我的控制器将使用的视图模型格式。

然后在我的控制器中,我还有一个成功和错误功能来处理以有意义的方式显示输出。但控制器只对显示数据感兴趣,服务处理任何转换,localStorage等。

此外,如果您的服务中有失败方法,则需要return $q.reject(error),如果您希望它触发控制器的捕获功能。

旁注,您可以使用params: ...轻松,干净地将查询参数附加到您的网址:

{
  method: 'GET',
  url: baseUrl + '/reservation',
  params: {
    lastName: lastName, 
    arrivalDate: arrivalDate
  }
}

我喜欢如何构建服务方法:

function searchReservations (lastName, arrivalDate) {
  var config = {
    method: 'GET',
    url: baseUrl + '/reservation',
    params: {
      lastName: lastName, 
      arrivalDate: arrivalDate
    }
  };
  return $http(config).then(success).catch(error);

  ////////////

  function success (response) {
    return response;
  }

  function error (response) {
    console.log('XHR Failed for searchReservation' + response.data);
    return $q.reject(response);
  }
}

注意,在这种情况下,您甚至不需要success方法,因为它不会执行任何操作,因此您可以完全跳过它:return $http(config).catch(error)

。控制器上的任何.then(...)仍会被触发。