Javascript AngularJS和调用局部函数时承诺值的影响-未定义

Javascript AngularJS和调用局部函数时承诺值的影响-未定义,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,我对Angular非常陌生,正在努力绕过我不想再使用的DB调用。在调用DB的代码的响应和通过getter访问存储变量的新代码之间,唯一的区别是响应对象的$promise值在新代码中未定义,而在旧代码中未定义。这种差异似乎导致了以下错误:TypeError:undefined不是一个函数;我使用的是AngularJS v1.2.0-rc.3。我必须使用异步调用才能将$PROMITE值设置为对象,还是有办法手动设置/强制转换它 以下是一些代码片段: 工厂查询服务: var recentRespons

我对Angular非常陌生,正在努力绕过我不想再使用的DB调用。在调用DB的代码的响应和通过getter访问存储变量的新代码之间,唯一的区别是响应对象的$promise值在新代码中未定义,而在旧代码中未定义。这种差异似乎导致了以下错误:TypeError:undefined不是一个函数;我使用的是AngularJS v1.2.0-rc.3。我必须使用异步调用才能将$PROMITE值设置为对象,还是有办法手动设置/强制转换它

以下是一些代码片段:

工厂查询服务:

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 field=Object;调用loadLastQueryResponse时,所有$scope.query字段都完全相同,只是$promise未定义,并且在尝试调用$scope.getVal2时,以下行失败并出现错误:

$scope.query.$resolved字段在这两种情况下均为true

我棱角分明的版本与此有关,还是因为我不需要等待承诺的实现,所以我没有等待承诺的实现?我还尝试使用处理程序调用QueryService.getRecentResponse,并尝试使用then格式,该格式可能正确实现,也可能没有正确实现,但结果是相同的


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

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

如果将语句$scope.getVal2=函数{..}移动到函数loadLastQueryResponse{..}上方会怎么样?其中是getRecentQueryResponse的代码。您可以共享完整的服务代码工厂实际返回的方法吗?@entre,抱歉,getRecentQueryResponse实际上是getRecentResponse-在将函数名转换为泛型函数名时,我输入了错误的名称。主要区别在于您的db调用是异步的,而另一个是同步的。
TypeError: undefined is not a function
    at loadLastQueryResponse (MyController.js:20)