角度服务承诺

时间:2015-05-29 15:11:31

标签: javascript angularjs typescript

所以,我有一个Angular应用程序可以对服务器进行调用。有一个服务包装了对服务器的调用。我目前在服务上有一个方法,它只是从$ http服务返回promise。我想在该方法调用上添加一些额外的处理,但由于promise的异步性质,我不知道该怎么做。

目前在打字稿中:

class BoardService {
    private $http;

    constructor($rootScope: IRootScope, $http: ng.IHttpService) {
          this.$http = $http;
    }

    fetchBoard(id: number) {
        return this.$http.get("/api/board/" + id);
    }
}

我想得到这样的东西:

fetchBoard2(id: number) {
    this.$http.get("/api/board/" + id).success(function(data)
    {
        // Manipulate the data

    });

    // return manipulated data; 
}

你会怎么做?

2 个答案:

答案 0 :(得分:10)

棘手的警告!因为promises是异步的,所以根据promise中的数据返回数据的任何东西本身都必须返回一个promise。您希望fetchBoard2返回一个承诺,一旦$http承诺回来并且您已经操纵了数据,该承诺就会得到解决。您可以使用Angular的$q服务。

fetchBoard2(id: number) {
  var deferred = $q.defer();

  $http.get("/api/board/" + id).success(function(data) {
    var newData = doSomething(data);
    deferred.resolve(newData);
  });

  return deferred.promise;
}

管理额外的延迟对象变得非常繁琐,因此您可以使用then将自己的操作插入到管道中。

fetchBoard3(id: number) {
  return $http.get(...).then(function(data) {
    return doSomething(data);
  });
}

有关详细信息,请访问a good article

答案 1 :(得分:0)

$http模块仅公开XMLHttpRequest的异步版本,因此您正在寻找的签名是不可能的。除非想要回退到另一个框架(例如jQuery),否则你将不得不使用返回的Promise对象。

将其视为工厂对象,使用该工厂对象注册将在数据返回时调用的处理程序。它们可以被链接,因此如果您想在将数据下传到下游之前处理数据,您可以在使用then method注册的处理程序中执行此操作。您在处理程序中返回的任何结果都将成为下一个then处理程序的数据。

(请注意,与success()不同,处理程序的参数是IHttpPromiseCallbackArg类型而不是数据本身。)