gpt4 book ai didi

javascript - 处理 promise 链中的错误

转载 作者:行者123 更新时间:2023-11-29 21:53:16 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com