处理承诺链中的错误



我正在使用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
    }
}

但这不是真正"好"的代码吗?一定有更好的办法吧?

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

相关内容

  • 没有找到相关文章

最新更新