【问题标题】:Angular promise resolved before factory executionAngular 承诺在工厂执行之前解决
【发布时间】:2016-11-23 18:04:22
【问题描述】:

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

我们想从success/error“迁移”到then/catch,但是我们在控制器中得到以下错误信息:TypeError: Cannot read property 'then' of undefined。

工厂方法如下():

'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”,则会出现上述错误。

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

【问题讨论】:

    标签: angularjs factory


    【解决方案1】:

    如果我错了,请纠正我 - 但你实际上并没有从这个函数的“新”版本返回任何东西。

        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”还是“response.data”):

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

    我不会在这个函数中捕捉错误,因为如果你捕捉到错误,你的控制器代码将无法捕捉它。

    您可能应该阅读一些关于 Promise 和 then/catch 链接的文档,这有点棘手。

    【讨论】:

    • 不同的是返回语句before '$http.get'。为了让控制器能够在某事上调用“.then”,必须返回“某事”。
    猜你喜欢
    • 2013-08-09
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 2018-12-14
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    相关资源
    最近更新 更多