角度处理不等待http.get .then

时间:2015-10-07 14:07:00

标签: javascript php angularjs get

我有一个问题,好像我的控制器没有等待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函数中进行一些处理,但是当它到达那里时它们是未定义的。

有人可以帮忙吗?我确信这是我失踪的一点点,但我想我已经尝试过在这些论坛上提供的所有解决方案,但最终仍然得到相同的结果。

3 个答案:

答案 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所建议的那样将函数链接在一起。