1
我有点困惑,应该如何处理我的情况中的承诺。如何处理链式承诺
这是我厂:
return {
getCategory: function(categoryId) {
var ref = firebase.database().ref().child('categories').child(categoryId);
var category = $firebaseObject(ref);
return category.$loaded().then(function() {
return category;
});
},
getEntry: function(categoryId, entryId) {
var ref = firebase.database().ref().child('entries').child(categoryId).child(entryId);
var entry = $firebaseObject(ref);
return entry.$loaded().then(function() {
return entry;
});
}
}
在我厂我会尽量避免做这样的:
var d = $q.defer();
if() {
d.resolve();
}
return d.promise;
由于加载了$()返回一个承诺本身。
这是我的控制器:
var categoryId = 'abc';
var entryId = 'def';
// so here i'm getting the category
MyFactory.getCategory(categoryId)
.then(function(category) {
if(category.$value === null)
{
$scope.error = 'The category does not exist';
}
else if(new Date() > new Date(category.expireDate))
{
$scope.error = 'The category has expired';
}
else {
$scope.category = category;
// if no errors
return MyFactory.getEntry(category.$id, entryId);
}
})
.then(function(entry) {
if(entry.$value === null)
{
$scope.error = 'No such entry';
}
else {
$scope.entry = entry;
}
})
.catch(function(error) {
console.error(error);
});
我想达到的目标是先拿到类别,然后是否有一些错误或不,分别获得该条目。数据来自Firebase数据库。
这样的工作,但是我真的不知道我应该如何处理的承诺,当我想要做下一个。然后和不把它们筑巢一个在其他像这样:
MyFactory.getCategory().then(function(category) {
if(no category errors) {
MyFactory.getEntry().then(function() {
// ...
});
}
});
现在我在控制台(它的类型错误条目未定义)出现错误,例如类别过期或不存在。 我想我在控制器中做了错误的事情,但我并不确定,希望你能帮助我消除所有疑虑。
所以真正的问题是我应该如何处理这个正确,按预期工作? 谢谢。
哦,天哪!这帮助了我很多。谢谢。 但又有点混乱。您正在服务中使用$ q.reject。哪个承诺实际上是拒绝?既然你不做$ q.defer()? –
我很高兴我可以帮助! '$ q.reject()'是一个创建和拒绝承诺的“捷径”。这里是官方文档 - https://docs.angularjs.org/api/ng/service/$q#reject –