如何处理链式承诺

拉夫

我有点困惑我应该如何处理我的情况下的承诺。

这是我的工厂:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何处理链式除外?

来自分类Dev

如何处理承诺中的错误?

来自分类Dev

如何处理JavaScript承诺或结果

来自分类Dev

如何处理承诺中的错误?

来自分类Dev

如何处理成功或错误的承诺

来自分类Dev

如何处理循环和承诺?

来自分类Dev

如何处理函数的承诺或变量返回

来自分类Dev

如何处理 NodeJS 中的嵌套承诺

来自分类Dev

如何处理生锈的盒装和链式错误?

来自分类Dev

从承诺创建高地流时如何处理承诺拒绝?

来自分类Dev

如何处理可能是angularjs中$ q承诺的对象?

来自分类Dev

如何处理不总是返回承诺的函数?

来自分类Dev

如何处理承诺链中的多个错误?

来自分类Dev

如何访问链式承诺之间的参数

来自分类常见问题

如果根据条件返回后续的承诺,如何处理承诺链?

来自分类Dev

如果根据条件返回后续的承诺,如何处理承诺链?

来自分类Dev

Node.js 处理来自链式承诺的响应

来自分类Dev

如何处理地理位置承诺中的特定错误代码?

来自分类Dev

Node.js和快速路由,如何处理客户端承诺

来自分类Dev

如何循环处理承诺?

来自分类Dev

如何循环处理承诺?

来自分类Dev

在链式承诺中,如果第一个承诺要求不要执行其余的承诺,如何

来自分类Dev

链式承诺和原型“ this”

来自分类Dev

链式承诺并保留`this`

来自分类Dev

Javascript链式承诺

来自分类Dev

如何处理流?

来自分类Dev

会话如何处理?

来自分类Dev

如何处理$ priority?

来自分类Dev

如何处理SIGHLD