Javascript Angular服务在返回承诺时引发异常
在我的app.js代码中,我运行了一些init代码,从服务器中提取会话变量 到目前为止还不错;然而,我现在尝试添加一个额外的调用来为treeview小部件提取数据。此新调用导致JavaScript异常:Javascript Angular服务在返回承诺时引发异常,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,在我的app.js代码中,我运行了一些init代码,从服务器中提取会话变量 到目前为止还不错;然而,我现在尝试添加一个额外的调用来为treeview小部件提取数据。此新调用导致JavaScript异常: "Cannot read property 'then' of undefined" 启动代码为: 1) app.run gets called first, 2) call into 'userService' to init various $rootScope vars 3) u
"Cannot read property 'then' of undefined"
启动代码为:
1) app.run gets called first,
2) call into 'userService' to init various $rootScope vars
3) userService makes API calls to a server and returns data. $q.defer() and $http is used
**接下来的步骤会导致异常
4) call into userService.getUserReportsTreeFromDataContext() from app.run
5) userService.getUserReportsTreeFromDataContext then calls down into datacontext.js (THIS SOMEHOW CAUSES AN EXCEPTION).
这是app.so中我的app.run()代码
app.run(['$route', '$rootScope', 'common', 'userService', function ($route, $rootScope, common, userService) {
// initialize session vars
userService.openUserSession(razorEnvJson).then(function (data) {
var sessionID = data.data[0];
$rootScope.rageSessionVars.sessionID = sessionID;
// **** THROWS EXCEPTION HERE ****
userService.getUserReportsTreeFromDataContext().then(function (data){
// var myData = data;
});
});
}]);
以及userContext.js服务中的一个片段:
this.openUserSession = function (razorEnvParams) {
_razorEnvParams = razorEnvParams;
_// some vars ommitted here for brevity
var url = "http://" + _domain + ":" + _port + controllerpath + "?userid=" + user + "&pass=" + pass;
var deferred = $q.defer();
deferred.notify("Opening user session...");
var retval = [];
$http({
method: 'GET',
encoding: 'JSON',
headers: {
'Access-Control-Allow-Origin': 'true',
'Content-Type': 'application/json'
},
withCredentials: true,
url: url
}).success(function (data, status, headers, config) {
retval = data;
deferred.resolve(retval);
}).error(function (data, status, headers, config) {
log("Cannot open a user session via api call. Errors details: " + data);
});
return deferred.promise;
}
this.getUserReportsTreeFromDataContext = function (userID) {
datacontext.getReportsTree().then(function (data) {
return data;
});
}
以及我的datacontext.js代码,用于从服务器提取数据,或提取一些测试数据:
(function () {
'use strict';
var serviceId = 'datacontext';
angular.module('app').factory(serviceId, ['$http', '$rootScope', 'common', datacontext]);
function datacontext($http, $rootScope, common) {
var $q = common.$q;
var service = {
getReportsTree: getReportsTree,
sendAggrRequestToServer: sendAggrRequestToServer,
};
return service;
function getReportsTree() {
var reportsJson = [
{
id: 1, text: "Standard", expanded: false, spriteCssClass: "rootfolder", checkChildren: true, items: [
{ id: 3, text: "MTM Aggr", reptName: "MTM Aggr" },
{ id: 4, text: "Member Aggr", reptName: "Member Aggr" }
]
},
{
id: 30, text: "Hierarchy", expanded: false, spriteCssClass: "rootfolder", checkChildren: true, items: [
{ id: 31, text: "Ctpy Hrchy", reptName: "CTPYHIER", withHierarchy: 'true' },
{ id: 32, text: "Ctpy/BkgLocation Hrchy", reptName: "CTPYHIER_BKG_LOC", withHierarchy: 'true' }
]
}
];
return $q.when(reportsJson);
}
})(); // end datacontext.js
仅供参考-我从dashboard.js控制器到datacontext.js进行了许多其他成功调用,没有任何问题
下面是一个很好的示例,其中一些测试数据来自datacontext:
dashboard.js-
function getPositionsData() {
datacontext.getPositions().then(function (data) {
vm.positionsData = data;
populateGridDataSource(vm.positionsData);
});
}
datacontext.js-
function getPositions() {
var positionsJson = [
{ id: 1, product: "BAX", instrument: "BOND-0003", position: 11, delta: 0.02, gamma: 0.79, initMarin: 600, initMarginPctChange: 250, varMargin: 75 },
{ id: 2, product: "BAX", instrument: "BOND-0004", position: -4, delta: 0.12, gamma: 0.46, initMarin: 400, initMarginPctChange: 300, varMargin: 65 },
{ id: 3, product: "BAX", instrument: "BOND-0004", position: 9, delta: 0.09, gamma: 0.55, initMarin: 700, initMarginPctChange: 200, varMargin: 40 }
];
return $q.when(positionsJson);
}
您忘记在
getUserReportsTreeFromDataContext
函数中返回初始承诺:应如下所示:
this.getUserReportsTreeFromDataContext = function (userID)
{ return datacontext.getReportsTree()
.then(function (data) { return data; });
}
您忘记在getUserReportsTreeFromDataContext函数中返回初始承诺:应该是这样的:this.getUserReportsTreeFromDataContext=function(userID){return datacontext.getReportsTree()。然后(function(data){return data;});}天哪,您说得对!换句话说,我在数据完成后返回数据,然后返回实际承诺。非常感谢。请添加准确的帖子作为您的答案!你能看一下吗?对不起,我检查了问题,但我对这个问题一无所知。