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