我有点困惑我应该如何处理我的情况下的承诺。
这是我的工厂:
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;
因为 $loaded() 本身返回一个承诺。
这是我的控制器:
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);
});
我要实现的就是先获取category,然后不管有没有错误,分别获取entry。数据来自 Firebase 数据库。
这是一种工作,但是我不确定当我想做下一个 .then 并且不要像这样将它们嵌套在另一个中时我应该如何处理承诺:
MyFactory.getCategory().then(function(category) {
if(no category errors) {
MyFactory.getEntry().then(function() {
// ...
});
}
});
现在,当例如类别过期或不存在时,我在控制台中收到错误(它的类型错误条目未定义)。我想我回来时在控制器中做错了什么,但我不太确定,希望您能帮助我消除所有疑虑。
所以真正的问题是我应该如何正确处理这个问题,才能按预期工作?谢谢。
当出现错误时,您应该返回一个被拒绝的承诺。
看下面的例子:
MyFactory
.getCategory(categoryId)
.then(function (category) {
if (category.$value === null) {
return $q.reject('The category does not exist');
}
if (new Date() > new Date(category.expireDate)) {
return $q.reject('The category has expired');
}
$scope.category = category;
return MyFactory.getEntry(category.$id, entryId);
})
.then(function (entry) {
if (entry.$value === null) {
return $q.reject('No such entry');
}
$scope.entry = entry;
})
.catch(function (error) {
$scope.error = error;
});
不要忘记注入$q
您的控制器。
编辑
我也建议您将“错误的逻辑”为您服务,所以该控制器总是收到其中一个数据.then(data => { ... })
或者一个错误字符串.catch(error => { ... })
。这将使您的控制器更干净,如果您在不同的控制器中使用这些服务方法,您也不必在那里复制您的逻辑。
服务
return {
getCategory: function(categoryId) {
var ref = firebase.database().ref().child('categories').child(categoryId);
var category = $firebaseObject(ref);
return category.$loaded().then(function() {
if (category.$value === null) {
return $q.reject('The category does not exist');
}
if (new Date() > new Date(category.expireDate)) {
return $q.reject('The category has expired');
}
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() {
if (entry.$value === null) {
return $q.reject('No such entry');
}
return entry;
});
}
}
控制器
MyFactory
.getCategory(categoryId)
.then(function (category) {
$scope.category = category;
return MyFactory.getEntry(category.$id, entryId);
})
.then(function (entry) {
$scope.entry = entry;
})
.catch(function (error) {
$scope.error = error;
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句