2014-10-09 39 views
0

在我的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); 
    } 
+1

您忘記了在getUserReportsTreeFromDataContext函數中返回您的初始承諾:應該是這樣的:this.getUserReportsTreeFromDataContext = function(userID){0}返回datacontext.getReportsTree()。​​then(function(data){ return data; }); } – cubbuk 2014-10-09 16:22:15

+0

哦,我的天啊,你是對的!換句話說,當數據完成時我會返回數據,然後我返回實際承諾。謝謝。請將您的答案添加到確切的文章中! – 2014-10-09 16:32:18

回答

1

你忘記返回初始承諾在getUserReportsTreeFromDataContext功能:應該是這樣的:

this.getUserReportsTreeFromDataContext = function (userID) 
{ return datacontext.getReportsTree() 
     .then(function (data) { return data; }); 
} 
+0

你可能有看看http://stackoverflow.com/questions/26263395/kendo-grid-with-dropdown-in-column-has-messed-up-styling/26266019#26266019? – 2014-10-09 16:36:07

+0

對不起,我檢查了這個問題,但我對這個問題一無所知。 – cubbuk 2014-10-09 16:49:12

+0

謝謝@cubbuk – 2014-10-09 17:06:03