AngularJS 以及调用局部函数时promise值的作用 - undefined

AngularJS and the effect of the promise value when calling a local function - undefined

我是 Angular 的新手,正在努力绕过一个我不想再使用的数据库调用。在调用数据库的代码的响应和访问存储变量(通过 getter)的新代码之间,唯一的区别是响应对象的 $promise 值是 undefined(在新代码)而不是 Object(在旧代码中)。这种差异似乎导致了以下错误:TypeError: undefined is not a function;我正在使用 AngularJS v1.2.0-rc.3 我必须使用异步调用才能将 $promise 值设置为 Object 还是有办法手动set/cast吗?

以下是一些代码片段:

工厂(查询服务):

var recentResponse = null;

var getRecentResponse = function() {
   return recentResponse;
};

var doQuery = function (input, handler, errorHandler) {
    MyResource.saveInput(input, function (response) {
            // save JSON response locally (NEW!)
            recentResponse = response;
            // save JSON response to DB via handler (old)
            handler(response);
        },
        function (errors) {
            errorHandler(errors);
    });
};

var getQueryById = function(id, handler) {
    // query the DB
    MyResource.getObjectWithId(id, function(response) {
        handler(response);
    });
};

return {
    doQuery: doQuery,
    getQueryById: getQueryById,
    getRecentResponse: getRecentResponse
};

控制器:

function loadQueryById(id) {
   // call the DB query
   QueryService.getQueryById(id, function(response) {
      $scope.query = response;
      $scope.query.val2 = $scope.getVal2();
   });
}

function loadLastQueryResponse() {
   // load from local var
   $scope.query = QueryService.getRecentResponse();
   $scope.query.val2 = $scope.getVal2();
}

loadQueryById($routeParams.id);
loadLastQueryResponse();

$scope.getVal2 = function() {
    return $scope.query.value2 ? JSON.parse($scope.query.value2) : "";
};

当调用loadQueryById()$scope.query设置为$promise字段=Object;当调用 loadLastQueryResponse() 时,所有 $scope.query 字段完全相同,除了 $promiseundefined,并且以下行在尝试调用 [=28= 时失败并出现错误]:

TypeError: undefined is not a function
    at loadLastQueryResponse (MyController.js:20)

$scope.query.$resolved 字段在这两种情况下都是 true

我的 Angular 版本是否与此有关,或者我没有等待兑现承诺(因为我不需要)?我也试过用处理程序调用 QueryService.getRecentResponse(),我也试过使用 then() 格式(我可能没有正确实现)但结果是一样的。

已更改函数和变量名称以保护无辜者。提前致谢!

正如@laurent 在评论中的回答,问题是一旦请求不再异步调用数据库,而是同步调用函数;因此必须将 $scope.getVal2 = function () {..} 声明移至 function loadLastQueryResponse(){..} 上方,以便后者中的调用代码知道前者的函数实现。