Javascript 作用域变量未在“”外部定义。然后是`method

Javascript 作用域变量未在“”外部定义。然后是`method,javascript,angularjs,ajax,scope,angular-promise,Javascript,Angularjs,Ajax,Scope,Angular Promise,我在if语句中更改了scope变量,在if语句之外,它变成了一个未定义的变量 app.controller("Login", function($scope, $window,$http){ var status; $scope.loginUser = function(logData){ $http.post('/corporate/login',logData).then(function(response){ var data =

我在if语句中更改了scope变量,在if语句之外,它变成了一个未定义的变量

app.controller("Login", function($scope, $window,$http){
    var status;
    $scope.loginUser = function(logData){
        $http.post('/corporate/login',logData).then(function(response){
              var data = response.data
              var status = data.success;
              if(status == true){
                $scope.logStatus = true;
                console.log($scope.logStatus); // prints true
              }else{
                $scope.logStatus = false;
              }
        })

        console.log($scope.logStatus); //prints undefined
    }
});

$http
是异步的。您的
if/else
条件在成功回调中。问题是
console.log($scope.logStatus)

您可能应该在调用
$http
之前初始化
$scope.logStatus=false

编辑:

如果如您所说,
$scope.logStatus
仍为false,则检查是否调用了If块。参见小提琴:

外面。。。它变成了一个未定义的变量

app.controller("Login", function($scope, $window,$http){
    var status;
    $scope.loginUser = function(logData){
        $http.post('/corporate/login',logData).then(function(response){
              var data = response.data
              var status = data.success;
              if(status == true){
                $scope.logStatus = true;
                console.log($scope.logStatus); // prints true
              }else{
                $scope.logStatus = false;
              }
        })

        console.log($scope.logStatus); //prints undefined
    }
});
它没有“变成”未定义的值。代码中的最后一个
console.log
在成功处理程序中的console.log之前执行。它是未定义的,因为成功处理程序尚未设置它


基于承诺的异步操作的解释

“Part4”的控制台日志不必等待数据从服务器返回。它在XHR启动后立即执行。“Part3”的控制台日志位于成功处理程序函数中,该函数由保存,并在数据从服务器到达且XHR完成后调用

有关详细信息,请参阅

演示
console.log(“第1部分”);
控制台日志(“第2部分”);
var promise=新承诺(r=>r());
promise.then(函数(){
控制台日志(“第3部分”);
});

console.log(“第4部分*”)
这样它将保持false,尽管if语句将其更改为true只需在调用
$http
之前写入
$scope.logStatus=false
,您的逻辑将正常工作!我只是这么做了,但它仍然是错误的,我相信如果是一个执行,而不是其他。异步回调不会更新scope变量,我确定这就是原因,但我找不到解决方案。你看到我发布的fiddle了吗?它当然会更新日志状态。是否在if块中获取console.log?唯一不同于您的代码和小提琴的是端点。确认其他代码是否没有覆盖LogStatus注意:$http
.success
方法是。相反,请使用标准的promise
.then
.catch
方法。这是否意味着如果我在“then()”块中定义了一个变量,我也只能从该块中引用该变量?例如,这行吗?:
var promise=$http.get(url);然后(函数successHandler(response){$scope.x=yz;});console.log($scope.x)