【问题标题】:Handling Errors in A Chain of Promises处理 Promise 链中的错误
【发布时间】:2015-01-11 12:38:56
【问题描述】:

我使用Q.js 作为承诺库。之前有这样的代码:

function X() {
    return Q.Promise(function(resolve, reject) {
        Users.find()
            .then(function(user) {
                Q.all([
                    getUserProfileInfo(user),
                    getUserSomethingElse(user)
                ])
                    .spread(function(profile, something) {
                        // do stuff

                        resolve();
                    })
                    .catch(function(err) {
                        // handle error for Q.all()

                        reject();
                    })
            })
            .catch(function(err) {
                // handle error for User.find()

                reject();
            });
    });
}

但现在我了解到我可以使用以下内容删除嵌套:

function X() {
    return Q.Promise(function(resolve, reject) {
        return Users.find()
            .then(function(user) {
                return Q.all([
                    getUserProfileInfo(user),
                    getUserSomethingElse(user)
                ]);
            })
            .spread(function(profile, something) {
                // do stuff

                resolve();
            })
            .catch(function(err) {
                // now how do I differenciate between 
                // the errors from Users.find() and Q.all()?

                reject();
            });
    });
}

底部(扁平)版本的“问题”是如何区分Users.find()Q.all() 的错误?或者一般来说,在长 then 链中可能还有许多其他错误?

目前我可能会使用类似的东西

function(err) {
    if (err.errors && err.statusCode) {
        // do something
    } else if (err.message) {
        // do something
    }
}

但这不是真正“好”的代码吗?一定会有更好的办法?

【问题讨论】:

标签: javascript promise q


【解决方案1】:

您可以像这样使用多个catch

function X() {
    return Q.Promise(function(resolve, reject) {
        return Users.find()
            .catch(function(err) {
                 // Handle user finding error
                 throw new Error("Problem in finding users");
            })
            .then(function(user) {
                return Q.all([
                    getUserProfileInfo(user),
                    getUserSomethingElse(user)
                ]);
            })
            .spread(function(profile, something) {
                // do stuff

                resolve();
            })
            .catch(function(err) {
                reject();
            });
    });
}

现在,如果在查找用户时出现问题,将执行第一个 catch 块,并且由于您从中抛出 Error,它将到达链中的下一个 catch 块。如果Users.find 没有错误,则控制将直接转到then 块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-21
    • 2019-02-17
    • 2019-01-05
    • 2016-04-20
    • 2016-06-08
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多