Angular服务承诺

6

我有一个使用Angular的应用程序,它通过restful调用与服务器通信。有一个服务封装了对服务器的调用。当前服务上有一个方法,该方法只是返回$http服务的promise。我想在该方法调用上添加一些额外的处理,但由于promise的异步性质,我不确定如何做。

目前使用typescript:

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个回答

10

注意:以下句子有些棘手!由于承诺是异步的,任何基于承诺数据返回数据的内容本身必须返回一个承诺。您希望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将自己的操作插入到管道中。

管理额外的延迟对象会变得非常麻烦,因此您可以使用then将自己的操作插入到流水线中。

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

如果想了解更多详情,这里有一篇好的文章


1
据我所知,.success() 的行为与 .then() 相同,并且也返回一个派生的 promise。return $http.get().success() 也可以正常工作。 - Okazari
3
几乎 - 感谢您让我核实这个。success返回原始的Promise(包含HTTP响应),而then返回一个新的Promise,该Promise解析为您提供的函数的结果。参考:https://dev59.com/N2Qo5IYBdhLWcg3wBLjy#23805864 - Kristján
1
谢谢你的补充,我之前并不知道得那么详细。 - Okazari
关于这个问题提了一个问题。http://stackoverflow.com/questions/30534328/why-do-http-get-success-success-fire-both-success?noredirect=1#comment49142538_30534328 - Okazari
1
感谢您澄清了then/success的问题。 - Darthg8r

0

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

将其视为工厂对象,您可以在其中注册处理程序,在数据返回时将调用这些处理程序。它们可以链接在一起,因此如果您想在将数据传递下游之前处理数据,则可以在使用 then 方法 注册的处理程序中轻松完成。您在处理程序中返回的任何结果都将成为下一个 then 处理程序的数据。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接