处理承诺链中的错误

时间:2015-01-11 02:39:24

标签: javascript promise q

我使用Q.js作为promises库。以前,theres代码如:

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
    }
}

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

1 个答案:

答案 0 :(得分:2)

您可以使用多个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块。