Я немного смущен, как мне обращаться с обещаниями в моей ситуации.
Это моя фабрика:
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);
});
Чего я хочу добиться, так это сначала получить категорию, а затем, есть ли какие-то ошибки или нет, получить запись соответственно. Данные поступают из базы данных Firebase.
Это работает, однако я не совсем уверен, как мне обрабатывать обещание, когда я хочу сделать следующее .then и не вкладывать их одно в другое, как это:
MyFactory.getCategory().then(function(category) {
if(no category errors) {
MyFactory.getEntry().then(function() {
// ...
});
}
});
На данный момент я получаю сообщение об ошибке в консоли (это тип записи ошибки не определен), когда, например, срок действия категории истек или не существует. Я думаю, что сделал что-то не так в контроллере, когда вернусь, но я не совсем уверен и надеюсь, что вы поможете мне развеять все сомнения.
Итак, реальный вопрос заключается в том, как мне с этим справиться правильно, чтобы он работал должным образом? Спасибо.