2

Я пытаюсь запросить некоторые данные в службе. Я хочу убедиться, что данные сохранены в переменной службы, так как из-за изменений состояния мой контроллер будет перезагружаться все время, и мне нужны данные только ТОЛЬКО когда загрузка сайта.Получение асинхронных данных из службы

app.service('resultDeals',['$translate','$cookies','$http', 
    function($translate,$cookies,$http) { 

     var currentOrigin = {}; 
     var originsUser={}; 

     return { 

     loadOrigins:function() { 
      $http.get('app/deals/deal.json').success(function(response){ 
      console.log(response); 
      originsUser = response.data; 
      return originsUser 
      }).error(function(err){ 
      console.log(err); 
      }); 
     }, 
     userOrigin:originsUser 

     }; 

    }]); 

и мой контроллер выглядит следующим образом

console.log(resultDeals.loadOrigins()); 
    $scope.updateOrigins=resultDeals.loadOrigins(); 

Проблема заключается в том, что resultDeals.loadOrigins() всегда не определено.

Я хочу, чтобы сохранить данные, полученные из loadOrigins(), в служебной переменной и только получить доступ к нему из контроллера, когда это необходимо, чтобы при перезагрузке контроллера данные больше не нужно получать.

Как это сделать?

ответ

2

Не используйте .success & .error функцию обратного вызова, так как они не имеют возможности вернуть что-либо и, следовательно, они не могут продолжать обещание цепь. Вместо этого используйте .then по методу $http.get (который возвращает объект обещания). Это будет иметь возможность return data, тогда как обещание было resolved или reject обещание. Вы можете продолжить цепочку promise с помощью метода контроллера.

Сервис

return { 
    loadOrigins: function() { 
     return $http.get('app/deals/deal.json') 
      .then(function(response) { 
      console.log(response); 
      originsUser = response.data; 
      return originsUser 
      }, function(err) { 
      console.log(err); 
      }); 
    }, 
    userOrigin: originsUser 
}; 

Контроллер

resultDeals.loadOrigins().then(function(user){ 
    $scope.updateOrigins= user; 
}, function(){ 
    console.log("Errror occurred.") 
}) 
+0

Спасибо за ваш ответ. Это не вернет '$ http.get (...), а затем (...). Ошибка не является функцией?? – Dribel

+0

@ user3383709 потому что '.then' не имеет' .error' метода .. –

+0

абсолютно прав ... спасибо за помощь – Dribel

2

Вам нужно иметь дело с обещаниями, когда вы работаете с асинхронным кодом. loadOrigins должен вернуть обещание, и ваш контроллер должен его использовать.

app.service('resultDeals',['$translate','$cookies','$http', '$q', 
function($translate,$cookies,$http,$q) { 

    var currentOrigin = {}; 
    var originsUser={}; 

    return { 

    loadOrigins:function() { 
     var deferred = $q.defer(); 

     $http.get('app/deals/deal.json').success(function(response){ 
     console.log(response); 
     originsUser = response.data; 
     deferred.resolve(originUser), 
     }).error(function(err){ 
     console.log(err); 
     deferred.reject(); 
     }); 

     return deferred.promise; 
    }, 
    userOrigin:originsUser 
    }; 

}]); 

// In controller 
resultDeals.loadOrigins().success(function(updateOrigins) { 
    $scope.updateOrigins = updateOrigins; 
}).error(function() { 
    console.log('bad !'); 
}); 
+0

Нет необходимости создания '$ q.defer();' как '$ http.get' уже возвращает обещание –

+0

Если он хочет для возврата response.data вместо ответа, вы должны использовать другое обещание. Нет? – Magus

+0

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

Смежные вопросы