进程承诺使用AngularJS中的装饰器或拦截器返回数据

时间:2015-02-12 11:37:50

标签: angularjs typescript decorator interceptor angular-promise

我有一个服务,它会执行一个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;
        });
    }

为了清理代码并使其更易于测试,我想将私有操作函数移除到装饰/拦截服务中。问题是我不知道如何在执行成功函数之前和返回之后挂钩promise数据。

例如,必须在数据到达后首先应用enrichWithLookups,而不是在返回miniPerson之后应用。

1 个答案:

答案 0 :(得分:0)

您可以创建本地承诺并致电&#34;解决&#34;完成对http响应的操作时的方法。看看这里的代码:

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

我已直接使用angularjs编写代码,但我认为您可以根据自己的需要轻松调整代码。

再见。