AngularJS: ответ $ http слишком медленный

0

Я использую этот код:

$http.get('/api/users').
success(function(data) {
    $scope.authors = data;
}).
error(function() {
    console.log('API error - config.')
}); 

И где-то внизу (много внизу):

for (var i = 0; i < $scope.authors.length; i++) {
    ...
};

Иногда бывает, что $scope.authors пока недоступны. Есть ли способ решить это?

ОБНОВИТЬ

Это целая структура блока:

// author

$http.get('/api/users').
success(function(data) {
    $scope.authors = data;
    processAuthors();
}).
error(function() {
    console.log('API error - config.')
});    

// if updating form

$scope.$on('$routeChangeSuccess', function() {
    if($routeParams.id) {

        $http.get('/api/offers/' + $routeParams.id).
        success(function(data) {

            // author

            function processAuthors() {
                for (var i = 0; i < $scope.authors.length; i++) {
                    if($scope.authors[i].email == data.author.email) {
                        $scope.author = $scope.authors[i];
                    };
                };                    
            }
  • 1
    Не вызывайте функцию, содержащую цикл for, пока не появятся авторы. $ http асинхронный. Вы не можете ожидать, что ответ будет там немедленно. Для получения дополнительной помощи, разместите полный пример.
Теги:

2 ответа

1

Да, неважно, насколько это ниже - вам все равно нужно вызвать его из обратного вызова, потому что он асинхронный вызов:

function processAuthors() {
    for (var i = 0; i < $scope.authors.length; i++) {
      ...
    };
}

А потом:

$http.get('/api/users').
success(function(data) {
    $scope.authors = data;
    processAuthors();
})

Я использовал функцию, чтобы сделать ее более чистым, но вы можете скопировать код, зависящий от обратного вызова внутри него.


ОБНОВИТЬ

function processAuthors(data) {
            for (var i = 0; i < $scope.authors.length; i++) {
                if($scope.authors[i].email == data.author.email) {
                    $scope.author = $scope.authors[i];
                };
            };                    
        }

$scope.$on('$routeChangeSuccess', function() {
    if($routeParams.id) {

        $http.get('/api/offers/' + $routeParams.id).
        success(function(data) {

            // author
            processAuthors(data);  // just call it here, define it outside
  • 0
    Это решение на самом деле великолепно, потому что мой код на самом деле намного ниже :)
  • 0
    Да, организация блока кода по функциям всегда хороша. Но иногда вам просто нужно сделать небольшой взлом и сделать его грязным. :)
Показать ещё 13 комментариев
1

Поместите цикл в последовательность:

$http.get('/api/users').
success(function(data) {
    $scope.authors = data;
    for (var i = 0; i < $scope.authors.length; i++) {
       ...
   };
}).
error(function() {
    console.log('API error - config.')
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню