我们正在尝试更新返回承诺的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",我会收到上述错误。
任何帮助将不胜感激。 最好的问候
答案 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,这有点棘手。