我有一个问题,好像我的控制器没有等待http.get' .then'。我正在正确地获取数据,但似乎在检索数据之前,另一个函数正在处理。我已经浏览了很多帖子并尝试了这些帖子中提到的许多内容,但它似乎没有帮助。我正在使用PHP来检索数据。
我有一个HTML文件,它调用了两个函数(我曾尝试过一个函数,但是当它没有工作时,我尝试将功能分开)。
电话的HTML
<form editable-form name="editableForm" onaftersave="fetch();updateDetailsData()" >
控制器功能
$scope.fetch = function() {
$http.get("api/checkSave/"+ JSON.stringify($scope.programDetails))
.then(function(data) {
$scope.okToSave = data.data.save;
$scope.missFields = data.data.fields;
console.log($scope.okToSave); // line #194
console.log($scope.missFields); // line #195
});
}
$scope.updateDetailsData = function(){
console.log($scope.okToSave); // line #202
}
控制台中显示的内容显示:
undefined // line 202
false // line 194 - correct data
Object // line 195 - correct data
如您所见,它似乎在fetch函数完成之前处理函数updateDetailsData。我认为当时应该让处理等到get结束 - 承诺返回。
我需要根据$ scope变量中的值在updateDetailsData函数中进行一些处理,但是当它到达那里时它们是未定义的。
有人可以帮忙吗?我确信这是我失踪的一点点,但我想我已经尝试过在这些论坛上提供的所有解决方案,但最终仍然得到相同的结果。
答案 0 :(得分:2)
问题来自:onaftersave="fetch(); updateDetailsData()"
。
update
函数会在fetch
返回后立即执行,而不会在fetch
已解决后立即执行。
稍微改造你的功能:
function fetch () {
return $http.get("api/checkSave/"+ JSON.stringify($scope.programDetails))
.then(function(data) {
// ...
});
}
$scope.fetchAndUpdate = function () {
fetch().then(updateDetailsData);
}
在模板中:
<form editable-form name="editableForm" onaftersave="fetchAndUpdate()">
答案 1 :(得分:1)
你正在使用承诺,所以你必须连接它们,它们不会阻塞:
<form editable-form name="editableForm" onaftersave="fetch().then(updateDetailsData)" >
控制器功能
$scope.fetch = function() {
return $http.get("api/checkSave/"+ JSON.stringify($scope.programDetails))
.then(function(data) {
$scope.okToSave = data.data.save;
$scope.missFields = data.data.fields;
console.log($scope.okToSave); // line #194
console.log($scope.missFields); // line #195
});
}
$scope.updateDetailsData = function(){
console.log($scope.okToSave); // line #202
}
答案 2 :(得分:0)
您的fetch
函数正在调用$http.get
,它会对您的服务器进行异步调用。这意味着调用将立即返回,它不会在等待服务器响应时阻止(即停止执行代码)。这就是您使用.then
函数提供回调的原因。
所以采取你目前编写的方式,它按设计工作。如果你想在你的updateDetailsData
代码之后执行then
函数,那么你必须把它放在then的内部,或者像Michael P. Bazos或Matthew Berg所建议的那样将函数链接在一起。