Angularjs 将承诺数据绑定到$scope

Angularjs 将承诺数据绑定到$scope,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我设计了一个工厂,它从url获取数据并将其返回给控制器。 在控制器中,我给这家工厂打了个电话。 我用$q来解决承诺。 从控制器调用工厂时,我试图将返回值分配给范围。 当我尝试访问作用域中的值时,分配了值之后,我得到了未定义的消息 你能帮我解决这个问题吗 app.factory('barchart', function($http,$q) { var factory={}; factory.drawChart=function() { var deferred=

我设计了一个工厂,它从url获取数据并将其返回给控制器。 在控制器中,我给这家工厂打了个电话。 我用$q来解决承诺。 从控制器调用工厂时,我试图将返回值分配给范围。 当我尝试访问作用域中的值时,分配了值之后,我得到了未定义的消息 你能帮我解决这个问题吗

app.factory('barchart', function($http,$q) {
    var factory={};
    factory.drawChart=function() {  
        var deferred=$q.defer();
        $http({
            method: 'GET',
            url: 'ActionServlet',
            headers: {'Content-Type': 'application/json' },
            params: {country: "densityplot"}
        })
        .success(function (data, status, headers, config) {
            deferred.resolve(data);
        })
        .error(function (data, status, headers, config) {
            // something went wrong :(
        });
        return deferred.promise;
        };
    return factory;
});

app.controller('mycontroller',function($scope, $http, barchart) {
    var promise = barchart.drawChart();
    console.log("Promise " + promise);
    promise.then(function(data) {
        $scope.barChartData = data;
        console.log("barchart data " + $scope.barChartData.getSVG());
    });
        console.log("barchart data " + $scope.barChartData.getSVG());
});
但当它在范围内时,它会显示数据。
每当我试图打印承诺范围之外的值时,它都会给出一个错误。

问题是,承诺范围之外的控制台语句在承诺返回之前被激发。。。因此未定义

app.controller('myController', function($scope, barchart) {        
    barchart.drawChart()
        .then(function(data) {
            $scope.barChartData = data;
            console.log("barchart data " + $scope.barChartData.getSVG());
        });

    console.log("barchart data " + $scope.barChartData.getSVG());
});
一方不尽然。。。$http服务是否实际返回函数对象?这似乎很奇怪,但并非不可能:

$scope.barChartData.getSVG();
如果您对工作方式感到困惑,您应该进一步阅读这个主题,但简而言之,您的代码是这样运行的。不接受

  • 条形图
  • $http()//工厂功能
  • 控制台日志(“承诺”+承诺)
  • log(“条形图数据”+$scope.barChartData.getSVG())//在then()之外的那个
  • 一些潜在的等待时间当我们等待http req作为其异步时,我们永远不知道返回值所需的确切时间-这就是承诺的所在
  • 然后()
  • $scope.barChartData=数据//言而有信
  • log(“条形图数据”+$scope.barChartData.getSVG())//言而有信
  • 你在一篇评论中说,当你的承诺得到回报时,你想让这件事在外面发生。你可以通过另一个承诺来实现这一点

    app.controller('myController', function($scope, $q, barchart) {        
         var requestFinished = $q.defer();
    
         barchart.drawChart()
            .then(function(data) {
                $scope.barChartData = data;
                console.log("barchart data " + $scope.barChartData.getSVG());
                requestFinished.resolve();
            });
    
         requestFinished.promise.then(function() {
             console.log("barchart data " + $scope.barChartData.getSVG());
         });
    });
    
    执行异步操作。您的
    然后
    如下

    promise.then(function(data) {
        $scope.barChartData = data;
        console.log("barchart data " + $scope.barChartData.getSVG());
    });
    
    使用异步操作完成$http后接收数据。它将数据放入变量并打印出来,一切正常

    但是,当您尝试在该范围之外登录时

    promise.then(function(data) {
        $scope.barChartData = data;
        console.log("barchart data " + $scope.barChartData.getSVG());
    });
    console.log("barchart data " + $scope.barChartData.getSVG());
    
    $http
    尚未完成其操作,因此
    $scope.barChartData
    仍未定义


    您的
    然后
    只是告诉控制器当从工厂收到承诺时该怎么做。仅仅因为那段代码在单独的日志之上并不意味着它会按那个顺序被调用

    是否可以同步上述代码?与此类似,只有在从远程服务器接收到promise后,才应该从promise中为作用域分配值?但它没有按照我希望的方式工作。它没有在控制台外部显示立即语句。我希望在外部分配后立即显示数据。是否可能?是否可以同步上述内容密码?与此类似,只有在从远程服务器接收到promise后,才应该为范围分配该值?@kai这是
    然后
    函数所做的,它是在服务完成远程调用时执行的,并将承诺返回给控制器。我需要的是,承诺中的值应该按照编写代码的顺序可用。因为我希望在jasmine中测试作用域中的值,当我尝试访问jasmine中的同一个作用域变量时,它表示未定义。因此,不知何故,我可以延迟一段时间,以便将数据分配到范围并立即访问?@KAI的测试服务返回承诺是一个完全不同的主题,最好为此创建一个单独的问题。至少你知道为什么它没有做你期望它做的事情,所以你可以从那里开始工作:-)