角度承诺在工厂执行前解决

时间:2016-11-23 18:04:23

标签: angularjs factory

我们正在尝试更新返回承诺的Factory。原始工厂使用$ http-> success->错误,控制器有.then(...)。

我们希望"迁移"从success / error到then / catch,但是我们在控制器中收到以下错误消息:TypeError: Cannot read property 'then' of undefined

Factory方法如下():

'use strict';
xmsbsExtranet.factory('projectsTimeTrackingServices', ['$resource', '$http', '$log', '$q', 'membershipServices',
    function ($resource, $http, $log, $q, membershipServices) {
        var serviceBase = 'http://localhost:51617/api/';
        var _model = {};

        var service = {
            model: _model,
            getByProjectId: _getByProjectId_new,
            upsert: _upsert,
        };
        return service;

        function _getByProjectId_old(projectId) {
            var deferred = $q.defer();
            $http({
                method: "Get",
                url: "../api/projectsTimeTracking/project/" + projectId
            }).success(function (response) {
                deferred.resolve(response);
            }).error(function (err, status) {
                //membershipServices.logOut();
                deferred.reject(err);
            });

            return deferred.promise;
        };

        function _getByProjectId_new(projectId) {
            $http.get("../api/projectsTimeTracking/project/" + projectId)
            .then(function (response) {
                return response.data;
            }).catch(function (err, status) {
                //membershipServices.logOut();
                return err;
            });
        };

    }]);

"短"控制器的版本如下:

projectsTimeTrackingServices
    .getByProjectId(vm.project.xrmId)
    .then(function (data) {
        //do something with the data
    });

当服务执行方法" _getByProjectId_old"时,一切都按预期工作。但如果我将其更改为" _getByProjectId_new",我会收到上述错误。

任何帮助将不胜感激。 最好的问候

1 个答案:

答案 0 :(得分:3)

如果我错了,请纠正我 - 但是你实际上并没有从“新的'这个功能的版本。

    function _getByProjectId_new(projectId) {

        //note that nothing is returned in THIS scope.

        $http.get("../api/projectsTimeTracking/project/" + projectId)
        .then(function (response) {
            return response.data;
        }).catch(function (err, status) {
            //membershipServices.logOut();
            return err;
        });
    };

您可以使用以下代码解决此问题:

    function _getByProjectId_new(projectId) {

        //note the new return statement
        return $http.get("../api/projectsTimeTracking/project/" + projectId)
    };

或此代码(取决于您是否要返回'回复'或' response.data'):

    function _getByProjectId_new(projectId) {

        //note the new return statement
        return $http.get("../api/projectsTimeTracking/project/" + projectId)
           .then(function (response) {
               return response.data;
            });
    };

我不会在此函数中捕获错误,因为如果您发现错误,您的控制器代码将无法捕获它。

你应该阅读一些关于promises的文档然后/ catch catch,这有点棘手。