角不等待承诺解决
我的问题是,角犯规等待的承诺得到解决。 你可以从控制台检查看到,它打印,它没有得到供应商和技能对象并低于承诺返回。角不等待承诺解决
添加下面是我认为最相关的部分代码。我使用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}]
谢谢所有帮助:)
的问题是,当你调用函数vm.getProviderById
和vm.getProviderSkills
它们调用的返回一个承诺等功能,但是这些功能本身并没有。因此他们被调用,然后继续下一步。
如果这些功能确实相互依赖,则需要将承诺链接在一起,或者从各自承诺的success
中调用它们。
它将帮助,如果你能写一段代码解释,因为我定义vm.getProviderById拨打服务功能,使HTTP请求和呼叫后有一个处理的响应上取得成功的。然后 –
在提供控制器的使用情况:
$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()你,你中止序列的休息,你在最后来处理在一个地方/日志错误。
即承诺是如何工作的:角不会等待一个承诺来解决,你将不得不把需要一直是一个'。那么()'回调内部解决的承诺代码。制作方法,如'vm.getProviderById()'返回他们所使用的承诺,然后移动访问'scope.provider' $'成。然后()'的代码。 – Duncan
如果你看一下getProviderById的函数定义的实现调用这使得HTTP请求,并返回'“返回$ Q的providerService。当(供应商);“'这是在成功。然后调用该服务后处理,$范围服务提供商设置有成为响应,所以我不明白您的回答,请详细说明 –