我知道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本身不会返回承诺吗?我不确定我需要一个服务,这就是为什么我在这里发帖看看我会怎么做。
任何帮助都将不胜感激。
答案 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
});