angularjs - 使用带有 angular 的 $q 服务

标签 angularjs angular-promise angularjs-http

我仍然无法理解使用 $q 服务的作用,(它究竟会添加什么)如果你想创建一个只需要通过 http 调用一个 API 的服务,在这种情况下我不知道为什么应该'我只是执行以下操作(不使用 $q):

this.getMovie = function(movie) {
  return $http.get('/api/v1/movies/' + movie)
    .then(
    function(response) {
      return {
        title: response.data.title,
        cost: response.data.price
      });
    },
    function(httpError) {
      // translate the error
      throw httpError.status + " : " +
        httpError.data;
    });
};

最佳答案

非常好的问题,很少有人喜欢回答。

考虑一下:

this.getMovie = function(movie) {
  return $http.get('/api/v1/movies/' + movie);
};

伟大的代码,但这些规则适用:

$http 将解析 2xx 响应,否则将拒绝。有时我们不想要这个。我们想拒绝决议并解决拒绝。当您考虑 HEAD 请求来检查某物的存在时,这是有道理的。

/book/fred 的 HEAD 请求返回 200 表明书 fred 存在。但是如果我的函数是测试 book fred 是否唯一,它不是,所以我们想拒绝 200。这就是 $q 的用武之地。现在我可以这样做:
var defer = $q.defer();
$http.head('/book/fred').then(function(response) {
    // 2xx response so reject because its not unique
    defer.reject(response);
}).catch(function(failResponse) {
    defer.resolve(failResponse);
});
return defer.promise;

$q 让我完全控制何时拒绝和何时解决。

此外, $q 允许我拒绝或解决任何值。因此,如果我只对某些响应感兴趣,我可以只用我感兴趣的部分来解决。

最后,我可以使用 $q 将基于非 promise 的代码转换为 promise 。
var a = 5;
var b = 10;
var defer = $q.defer();
var resolve(a+b);
return defer.promise;

波什,如果我需要一个 promise 作为我的返回值,那么我有一个。

这在模拟单元测试时也很棒。

关于angularjs - 使用带有 angular 的 $q 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36365583/

相关文章:

javascript - angularjs 范围变量未在指令外部更新

javascript - AngularJS $http.post 上的错误 access-control-allow-origin

javascript - 等待 1 个 promise ,然后所有 promise 都使用 $q

angularjs - angular jasmine 多个嵌套的 httpbackend 调用

javascript - $http GET 的 AngularJS API 调用错误

javascript - AngularJS,如何使用服务捕获 HTTP 数据并将其绑定(bind)到我的 Controller ?

javascript - 如何获取 Angular 表达式的实际值

javascript - 将 offsetTop 与 AngularJS ng-repeat 结合使用

javascript - 为什么 $scope.someArray.push 不是传递给 $q.promise 上的 .then 的有效函数

java - 使用 Angularjs 将文件上传到 SpringMVC 时出现错误状态 415