在我的app.js代碼中,我運行了一些從服務器中拉出會話變量的init代碼。Angular Service在返回承諾時拋出異常
目前爲止好;但是我現在試圖添加一個額外的調用來爲treeview小部件提取數據。這種新的呼叫是導致JavaScript異常:
"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.run()代碼內的代碼.so
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){0}返回datacontext.getReportsTree()。then(function(data){ return data; }); } – cubbuk 2014-10-09 16:22:15
哦,我的天啊,你是對的!換句話說,當數據完成時我會返回數據,然後我返回實際承諾。謝謝。請將您的答案添加到確切的文章中! – 2014-10-09 16:32:18