角度异步函数返回值到变量

时间:2016-07-18 16:24:11

标签: javascript angularjs asynchronous

我知道Angular之前已经问过这样的问题,遗憾的是我无法使用任何这些解决方案来处理我的具体实现,所以我在这里问。

我在这里有一个函数scope.getOrders()

    $scope.lastOrderFetch,$scope.orders;
    $scope.getOrders = function(){

if(moment().diff(moment($scope.lastOrderFetch))>5000||$scope.lastOrderFetch==null){
                 $http({
            method: 'GET',
            url: 'http://www.example.com/getOrders',
        }).then(function successCallback(html) {
            $scope.orders = html.data;
            $scope.lastOrderFetch = new Date();
            return html.data;
        });
            }
            else{
                return $scope.orders;
            }
        }; 

我只想让后端的订单在这里填充一个变量:

var orders = $scope.getOrders();

这是另一个功能。我收集我的问题orders始终未定义,因为它正在尝试分配给它,而$http仍在使用它是神奇的,它是异步的,因此$http数据无法立即获得

我也收集我应该使用服务然后是承诺或者其他东西,但我的问题是$ http应该只根据控制器中的条件触发。还有很多解决方案混合了回调和承诺,所以我不知道该怎么做。另外,$ http本身不会返回承诺吗?我不确定我需要一个服务,这就是为什么我在这里发帖看看我会怎么做。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

我认为您在工作流程控制方面存在问题,请尝试使用callback函数方式:

$scope.getOrders = function(callback){
 if(moment().diff(moment($scope.lastOrderFetch))>5000||$scope.lastOrderFetch==null){
             $http({
        method: 'GET',
        url: 'http://www.example.com/getOrders',
    }).then(function successCallback(html) {
        $scope.orders = html.data;
        $scope.lastOrderFetch = new Date();
        return html.data;
    });
        }
        else{
            return callback($scope.orders);
        }
    }; 

$scope.getOrders(function dataReady(data){
   var orders = = data; // data === $scope.orders

  // do your logic here
});

答案 1 :(得分:1)

这也可以帮助你(使用承诺):

$scope.getOrders = function(){

   var deferred = $q.defer(); 
   if(moment().diff(moment($scope.lastOrderFetch))>5000||$scope.lastOrderFetch==null){
        $http({
            method: 'GET',
            url: 'http://www.example.com/getOrders',
        }).then(function successCallback(response) {
            $scope.orders = response.data;
            $scope.lastOrderFetch = new Date();
            deffered.resolve(response.data);
    });

    } else {
        deferred.resolve($scope.orders);
    }
    return deferred.promise;
}; 

并称之为:

$scope.getOrders().then(function(response){
     // code after you get the response
});