2015-05-29 116 views
5

所以,我有一个Angular应用程序,使服务器的平稳呼叫。有一种服务包装了对服务器的呼叫。我目前在服务上有一个方法,它只是从$ http服务返回承诺。我想在该方法调用中添加一些额外的处理,但由于承诺的异步性质,我不确定如何去做。角度服务承诺

目前打字稿:

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; 
} 

你会怎么做呢?

回答

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将您自己的操作进入管道。

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

欲了解更多详情,这里的a good article

+1

据我所知,.success()的行为一样。那么(),并返回一个派生诺言也是如此返回$ http.get()。success()也会起作用。 – Okazari

+3

几乎 - 感谢让我验证这一点。 'success'返回最初的promise(包含HTTP响应),'then'返回一个新的promise,这个promise会通过你给它的函数的结果解决。参考:http://stackoverflow.com/a/23805864/802618 –

+1

Thx为补充,现在没有这个确切的。 – Okazari

0

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

把它看作是一个工厂对象,用它来注册数据返回时将被调用的处理程序。它们可以链接在一起,所以如果你想在下游处理数据之前处理数据,你可以简单地在你使用then method注册的处理程序中进行处理。您在处理程序中返回的任何结果将成为下一个then处理程序的数据。

(请注意,与success(),争论到您的处理是IHttpPromiseCallbackArg类型而不是数据本身)。