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

标签 javascript bluebird

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

相关文章:

node.js - Bluebird 的适当 promise

node.js - 版本错误: No matching document found error only on (Mocha) test

javascript - 从函数值中打破 promise 图?

JavaScript:浏览器控制台如何显示对象键值

javascript - 功能是一键延迟jquery

parse-platform - 如何将 Parse.Promise 与其他形式的 Promise 混合使用,例如Bluebird/ES6 原生 promise ?

node.js - 内存泄漏 - 循环中的 promise

javascript - Post请求的参数数量有限制吗?

javascript - Highcharts 中存在多个系列数据,但第二条线图显示被压扁?

javascript - 如何定义组件是否嵌套在 Angular 6 中?