Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将承诺与然后和捕获链接在一起_Javascript_Bluebird - Fatal编程技术网

Javascript 将承诺与然后和捕获链接在一起

Javascript 将承诺与然后和捕获链接在一起,javascript,bluebird,Javascript,Bluebird,我正在使用蓝鸟承诺图书馆。我希望链接承诺并捕捉特定的承诺错误。以下是我正在做的: getSession(sessionId) .catch(function (err) { next(new Error('session not found')); }) .then(function (session) { return getUser(session.user_id); }) .catch(function (err) { next(new Erro

我正在使用蓝鸟承诺图书馆。我希望链接承诺并捕捉特定的承诺错误。以下是我正在做的:

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
,以及第二个
然后
。我希望在第一次
catch
时停止错误传播,这样第二次
catch
仅在
getUser
抛出时调用,第二次
getUser
成功时调用。怎么办?

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

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();
});
或者使用第二个回调函数
,然后

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);

因为您使用bluebird来表示承诺,所以实际上不需要在每个函数之后都使用catch语句。你可以把你所有的鱼钩都拴在一起,然后用一个鱼钩把整个鱼钩都扣上。大概是这样的:

getSession(sessionId)
  .then(function (session) {
    return getUser(session.user_id);
  })
  .then(function (user) {
    req.user = user;
    next();
  })
  .catch(function(error){
    /* potentially some code for generating an error specific message here */
    next(error);
  });
假设错误消息告诉您错误是什么,仍然可以发送特定于错误的消息,如“会话未找到”或“用户未找到”,但您只需查看错误消息即可查看它给您的信息


注意:我相信无论是否有错误,您都有理由调用next,但在出现错误的情况下,插入console.error(error)可能会很有用。或者,您可以使用其他一些错误处理功能,无论是console.error还是res.send(404)之类的功能。

我就是这样使用它的:

getSession(x)
.then(function (a) {
    ...
})
.then(function (b) {
    if(err){
        throw next(new Error('err msg'))
    }
    ...
})
.then(function (c) {
    ...
})
.catch(next);

如果出现错误,为什么要调用next()?有没有像next()这样的abort()可以使用?我用的是express
next
调用下一个中间件。如果您向它传递一个参数,那么它将跳转到错误中间件。