2016-07-18 2 views
-1

Я знаю, что такие вопросы были заданы раньше с помощью 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; 
      } 
     }; 

Я просто хочу заказы от внутреннего интерфейса к popuplate переменной здесь:

var orders = $scope.getOrders(); 

, который находится в другой функции. Я понимаю, что моя проблема: orders всегда неопределен, потому что он пытается назначить ему, а $http все еще работает, это волшебство, и оно асинхронно, поэтому данные $http недоступны сразу.

Я также собираюсь использовать сервис, а затем обещание или что-то в этом роде, но моя проблема заключается в том, что $ http должен срабатывать только на основе условного в контроллере. Также множество решений сочетают обратные вызовы и обещания, поэтому я не уверен, что делать здесь. Кроме того, не $ http сама возвращает обещание? Я не уверен, что мне нужен сервис, поэтому я публикую здесь, чтобы посмотреть, как я это сделаю.

Любая помощь будет оценена по достоинству.

+0

Вы пытаетесь использовать функцию возврата ключевого слова вне функции. – Todd

+0

ой, если только вы не пропустили его при копировании/вставке – Todd

+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

Это может помочь вам тоже (используя обещание):

$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 
}); 
Смежные вопросы