在AngularJS中使用decorator或interceptor处理promise返回的数据

在AngularJS中使用decorator或interceptor处理promise返回的数据,angularjs,typescript,decorator,interceptor,angular-promise,Angularjs,Typescript,Decorator,Interceptor,Angular Promise,我有一个服务,它执行http请求来保存一些数据。当数据来自后端时,我正在对数据进行一些操作,然后返回数据,以便控制器可以使用它们。比如: public savePerson = (person: Model.IPerson): ng.IPromise<Model.IMiniPerson> => { return this.api.persons.save({}, person).then((savedPerson) => {

我有一个服务,它执行http请求来保存一些数据。当数据来自后端时,我正在对数据进行一些操作,然后返回数据,以便控制器可以使用它们。比如:

    public savePerson = (person: Model.IPerson): ng.IPromise<Model.IMiniPerson> => {
        return this.api.persons.save({}, person).then((savedPerson) => {
            this.enrichWithLookups(savedPerson);
            var miniPerson = new Model.MiniPerson();
            angular.extend(miniPerson, savedPerson);
            miniPerson.afterLoad();
            this.persons.unshift(miniPerson);
            this.notifyOfChanges();
            return miniPerson;
        });
    }
publicsaveperson=(person:Model.IPerson):ng.IPromise=>{
返回this.api.persons.save({},person)。然后((savedPerson)=>{
这个。通过查找丰富(savedPerson);
var miniPerson=new Model.miniPerson();
角度。延伸(迷你人、储蓄人);
miniPerson.afterLoad();
此.persons.unshift(迷你人);
这个.notifyOfChanges();
返回迷你人;
});
}
为了稍微清理代码并使其更易于测试,我想将私有操作函数删除到装饰/拦截服务中。问题是我不知道如何在执行success函数之前和返回之后钩住promise数据


例如,EnrichWithLookup必须在数据到达后立即应用,而不是在miniPerson返回后应用。

您可以创建一个本地承诺,并在完成对http响应的操作后调用“resolve”方法。请看下面的代码:

public savePerson = (person: Model.IPerson): ng.IPromise<Model.IMiniPerson> => {
        var waiter = $q.defer();

        this.api.persons.save({}, person).then((savedPerson) => {
            this.enrichWithLookups(savedPerson);
            var miniPerson = new Model.MiniPerson();
            angular.extend(miniPerson, savedPerson);
            miniPerson.afterLoad();
            this.persons.unshift(miniPerson);
            this.notifyOfChanges();
            waiter.resolve(miniPerson);
        });

        return waiter.promise;
    }
publicsaveperson=(person:Model.IPerson):ng.IPromise=>{
var waterer=$q.defer();
this.api.persons.save({},person).then((savedPerson)=>{
这个。通过查找丰富(savedPerson);
var miniPerson=new Model.miniPerson();
角度。延伸(迷你人、储蓄人);
miniPerson.afterLoad();
此.persons.unshift(迷你人);
这个.notifyOfChanges();
服务员。解决(迷你人);
});
回报服务生。承诺;
}
我已经直接用angularjs编写了代码,但我认为您可以轻松地对其进行调整以满足您的需要


再见。

您使用的语法如下:
api.then(miniPersonHook)。then(enrichWithLookups)
基本上是承诺链问题在于成功已经让miniPerson在其中得到了解决,而不是原始数据。在decorator内部,我会得到一个承诺,但承诺将首先在服务内部解决,然后在装饰服务上解决。好的,我现在明白你的意思了,但这涉及到将原始服务更改为使用$q来包装原始承诺。这绝对是一种方式,我只是希望有一种更干净的方式,不必改变原有的服务;您有两种方法:如我前面所说,将此逻辑放入服务中,或者将检查逻辑放入控制器中;最后一种方法意味着您需要等待数据可视化,直到它理解装饰器已经完成了它的工作。不幸的是,在我的例子中,第二种方法根本不是一个选项,因为装饰器所做的更改会影响后面执行的方法的结果。