所以,我有一个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;
}
你会怎么做?
答案 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
类型而不是数据本身。)