2016-11-23 104 views
1

我的问题是,角犯规等待的承诺得到解决。 你可以从控制台检查看到,它打印,它没有得到供应商和技能对象并低于承诺返回。角不等待承诺解决

添加下面是我认为最相关的部分代码。我使用angulars库 - $ 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); 
    }; 

提供商控制器定义:

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

提供控制器的使用情况:

$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

即承诺是如何工作的:角不会等待一个承诺来解决,你将不得不把需要一直是一个'。那么()'回调内部解决的承诺代码。制作方法,如'vm.getProviderById()'返回他们所使用的承诺,然后移动访问'scope.provider' $'成。然后()'的代码。 – Duncan

+0

如果你看一下getProviderById的函数定义的实现调用这使得HTTP请求,并返回'“返回$ Q的providerService。当(供应商);“'这是在成功。然后调用该服务后处理,$范围服务提供商设置有成为响应,所以我不明白您的回答,请详细说明 –

回答

2

的问题是,当你调用函数vm.getProviderByIdvm.getProviderSkills它们调用的返回一个承诺等功能,但是这些功能本身并没有。因此他们被调用,然后继续下一步。

如果这些功能确实相互依赖,则需要将承诺链接在一起,或者从各自承诺的success中调用它们。

+0

它将帮助,如果你能写一段代码解释,因为我定义vm.getProviderById拨打服务功能,使HTTP请求和呼叫后有一个处理的响应上取得成功的。然后 –

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()你,你中止序列的休息,你在最后来处理在一个地方/日志错误。