2016-11-23 4 views
1

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

, добавленные ниже, являются наиболее подходящими частями кода, на мой взгляд. Я выполнил эту службу с помощью библиотеки углов - $ 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}] 

Спасибо, за помощь :)

+0

Это то, как обещают работу: угловые не будут ждать обещания решить, вам придется поставить код, требующий, чтобы обещание было разрешено внутри обратного вызова '.then()'. Создайте методы, такие как 'vm.getProviderById()' возвратите обещание, которое они используют, а затем переместите код, который обращается к '$ scope.provider', в' .then() '. – Duncan

+0

, если вы посмотрите на определение функции getProviderById, реализация вызывает providerService, которая делает HTTP-запрос и возвращает '' return $ q.когда (поставщик); «он обрабатывается после вызова службы в .then при успешном завершении, а провайдер $ scope установлен для ответа. Поэтому я не понимаю ваш ответ, пожалуйста, уточните, –

ответ

2

Проблема заключается в том, что при вызове функции vm.getProviderById и vm.getProviderSkills они называют другие функции, которые возвращают обещание, однако эти функции сами по себе не делает. Поэтому они вызываются, а затем переходят к следующим шагам.

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

+0

это поможет, если вы сможете напишите фрагмент кода, объяснив его, потому что я определяю vm.getProviderById для вызова функции сервиса, которая делает HTTP-запрос, и после вызова есть. then по успеху, который обрабатывает ответ –

0

В Использование контроллера Поставщик:

$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'); 
} 

Когда вызов vm.getProviderId() возвращается, единственное, что вы можете быть уверены в том, что ни один из .then() кода в vm.getProviderId() пока не называется. Но затем вы пытаетесь получить доступ к $scope.provider, и он не будет установлен.

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

vm.getProviderById = getProviderById; 

function getProviderById(providersId){ 
    return providerService.getProviderById(providersId) 
     .then(function onSuccess(providerResult){ 
      console.log('providerResult - ' + JSON.stringify(providerResult)); 
      return provider; 
     }, function onError(error){ 
      console.log('error getting provider by id - ' + error); 
     }); 
} 

И изменить getProviderSkills() подобным образом также вернуть окончательное обещание.

Теперь вы использовать его как это:

vm.getProviderById($scope.user.provider) 
.then(function(provider) { 
    $scope.provider = provider; // If you still need to save it in scope. 
    if (provider !== null && provider !== undefined) { 
     console.log('provider - ' + JSON.stringify(provider)); 
    } else { 
     return $q.reject('didnt get provider object'); 
    } 
    return vm.getProviderSkills(provider); 
}) 
.then(function(skills) { 
    if (skills === null || skills === undefined) { 
     return $q.reject('didn\'t get skills object'); 
    } 
    $scope.skills = skills; 
}, 
function failureCallback(error) { 
    console.log(error); 
}); 

Обратите внимание, что по возвращению $ q.reject() вы вы прервать остальную часть последовательности и у вас есть одно место, в конце концов, чтобы справиться с/регистрирует ошибка.

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