Моя проблема заключается в том, что угловой не ждет, пока обещания будут решены. , как вы можете видеть в инспектировании с консоли, он печатает, что он не получил объект провайдера и навыков и чуть ниже того, что обещания возвращаются.угловой не ждет обещаний решить
, добавленные ниже, являются наиболее подходящими частями кода, на мой взгляд. Я выполнил эту службу с помощью библиотеки углов - $ q и использовал отложенные, а затем и варианты - как вы можете видеть в приведенной ниже услуге.
Поставщик услуг:
this.getProviderById = function (providersId) {
// will hold backend provider of the provider with id = providersId
var provider = undefined;
// if provider object is not defined then start the new process to fetch it
if (!provider) {
// create deferred object using $q
var deferred = $q.defer();
// get provider form backend
$http.get('http://localhost:3000/providers/getbyid/' + providersId)
.then(function (result) {
console.log('provider by id result - ' + JSON.stringify(result.data));
// save fetched provider to the local variable
provider = result.data;
// resolve the deferred
deferred.resolve(provider);
}, function (error) {
providers = error;
deferred.reject(error);
});
// set the provider object to be a promise until result comeback
provider = deferred.promise;
}
return $q.when(provider);
};
Provider контроллер Определение:
var vm = this;
vm.getCurrentUser = getCurrentUser;
function getCurrentUser(){
console.log('returning current user from auth service');
return authService.getCurrentUser();
}
vm.getProviderById = getProviderById;
function getProviderById(providersId){
providerService.getProviderById(providersId)
.then(function onSuccess(providerResult){
console.log('providerResult - ' + JSON.stringify(providerResult));
$scope.provider = providerResult;
}, function onError(error){
console.log('error getting provider by id - ' + error);
});
}
vm.getProviderSkills = getProviderSkills;
function getProviderSkills(providersId){
providerService.getProvidersSkills(providersId).then(function onSuccess(resultSkills){
console.log('resultSkills - ' + JSON.stringify(resultSkills));
$scope.skills = resultSkills;
}, function onError(error){
console.log('error getting providers - ' + $scope.provider + ' - skills');
});
}
Использование Provider Контроллер:
$scope.user = vm.getCurrentUser();
if ($scope.user !== null && $scope.user !== undefined) {
console.log('user - ' + JSON.stringify($scope.user));
} else {
vm.initUsersProvider();
console.log('initiated users provider');
}
vm.getProviderById($scope.user.provider);
if ($scope.provider !== null && $scope.provider !== undefined) {
console.log('provider - ' + JSON.stringify($scope.provider));
} else {
console.log('didnt get provider object');
}
vm.getProviderSkills($scope.provider);
if ($scope.skills !== null && $scope.skills !== undefined) {
console.log('provider - ' + JSON.stringify($scope.skills));
} else {
console.log('didnt get skills object');
}
Проверьте консоль Отображение результата на картинке выше:
user - {"_id":"5835b06b975ace23244bf205","email":"[email protected]","password":"","fbuser":"5835b06a975ace23244bf204","provider":"5835b06f975ace23244bf206","admin":false,"__v":0}
ProviderRegisterController.js:14 providersId - 5835b06f975ace23244bf206
providerService.js:74 providersId - 5835b06f975ace23244bf206
ProviderRegisterController.js:110 didnt get provider object
ProviderRegisterController.js:117 didnt get skills object
ProviderRegisterController.js:122 no availability module found
ProviderRegisterController.js:124 no bio module found
providerService.js:83 provider by id result - {"_id":"5835b06f975ace23244bf206","bio":"","__v":2,"references":[],"availability":{"auto":true},"skills":["5835b220975ace23244bf208","5835b2ff975ace23244bf209"]}
ProviderRegisterController.js:17 providerResult - {"_id":"5835b06f975ace23244bf206","bio":"","__v":2,"references":[],"availability":{"auto":true},"skills":["5835b220975ace23244bf208","5835b2ff975ace23244bf209"]}
providerService.js:56 received skills from db - [object Object],[object Object]
ProviderRegisterController.js:27 resultSkills - [{"_id":"5835b220975ace23244bf208","topic":2,"description":"sdfsdf","price":45,"status":"PENDING","__v":0},{"_id":"5835b2ff975ace23244bf209","topic":1,"description":"ddfgdfg","price":45,"status":"PENDING","__v":0}]
Спасибо, за помощь :)
Это то, как обещают работу: угловые не будут ждать обещания решить, вам придется поставить код, требующий, чтобы обещание было разрешено внутри обратного вызова '.then()'. Создайте методы, такие как 'vm.getProviderById()' возвратите обещание, которое они используют, а затем переместите код, который обращается к '$ scope.provider', в' .then() '. – Duncan
, если вы посмотрите на определение функции getProviderById, реализация вызывает providerService, которая делает HTTP-запрос и возвращает '' return $ q.когда (поставщик); «он обрабатывается после вызова службы в .then при успешном завершении, а провайдер $ scope установлен для ответа. Поэтому я не понимаю ваш ответ, пожалуйста, уточните, –