javascript - 处理 Promise 链中的错误

标签 javascript promise q

我正在使用Q.js作为一个 promise 库。以前,有这样的代码:

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 block ,如下所示

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 block ,并且由于您从中抛出 Error ,因此它将到达链中的下一个 catch block 。如果Users.find中没有错误,那么控制将直接转到then block 。

关于javascript - 处理 Promise 链中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27883439/

相关文章:

javascript - IIS 重写规则以将查询字符串添加到 ASP.net 页面中的 .css 和 .js 引用?

javascript - 如何包装 Javascript 函数以便捕获所有错误,包括 Promise 拒绝

javascript - 关于JavaScript中的Promise的一些问题

javascript - Q - Javascript promise 等待数组被填充

javascript - Cordova 5白名单、Content-Security-Policy和本地网络ip

javascript - 替换推文按钮图标

javascript - JavaScript 中异步任务的执行顺序 : Promise and setTimeout

javascript - 我如何在 node.js 中使用 promises 来清理回调链?

javascript - q 库 promise 将一个值传递给 done 方法

javascript - 将配置加载到 Redux 应用程序的正确方法