gpt4 book ai didi

javascript - 将 Promise 与 then 和 catch 链接起来

转载 作者:行者123 更新时间:2023-12-03 01:37:17 24 4
gpt4 key购买 nike

我正在使用 bluebird Promise 库。我想链接 promise 并捕获特定的 promise 错误。这就是我正在做的事情:

getSession(sessionId)
.catch(function (err) {
next(new Error('session not found'));
})
.then(function (session) {
return getUser(session.user_id);
})
.catch(function (err) {
next(new Error('user not found'));
})
.then(function (user) {
req.user = user;
next();
});

但是,如果 getSession 抛出错误,则会调用两个 catch 以及第二个 then。我想在第一个 catch 处停止错误传播,以便仅在 getUser 抛出时调用第二个 catch ,而第二个thengetUser 成功时。做什么?

最佳答案

.catch 方法返回的 Promise 仍将通过回调的结果来解析,它不仅仅停止链的传播。您需要对链进行分支:

var session = getSession(sessionId);
session.catch(function (err) { next(new Error('session not found')); });
var user = session.get("user_id").then(getUser);
user.catch(function (err) { next(new Error('user not found')); })
user.then(function (user) {
req.user = user;
next();
});

或使用第二个回调then:

getSession(sessionId).then(function(session) {
getUser(session.user_id).then(function (user) {
req.user = user;
next();
}, function (err) {
next(new Error('user not found'));
});
}, function (err) {
next(new Error('session not found'));
});
<小时/>

或者,更好的方法是仅通过链传播错误,并仅在最后调用 next:

getSession(sessionId).catch(function (err) {
throw new Error('session not found'));
}).then(function(session) {
return getUser(session.user_id).catch(function (err) {
throw new Error('user not found'));
})
}).then(function (user) {
req.user = user;
return null;
}).then(next, next);

关于javascript - 将 Promise 与 then 和 catch 链接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24619444/

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