角度服务承诺

Dar*_*g8r 6 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想得到这样的东西:

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

    });

    // return manipulated data; 
}
Run Code Online (Sandbox Code Playgroud)

你会怎么做?

Kri*_*ján 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;
}
Run Code Online (Sandbox Code Playgroud)

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

fetchBoard3(id: number) {
  return $http.get(...).then(function(data) {
    return doSomething(data);
  });
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅这篇文章.

  • 几乎 - 谢谢你让我验证这一点.`success`返回原始promise(包含HTTP响应),`then`返回一个新的promise,它使用你给它的函数的结果解析.参考:http://stackoverflow.com/a/23805864/802618 (3认同)