Nextrp [CPP] RU + Many GEOs Игра на карте России | NEXTRP

Цепочные обещания с этим и поймать

javascript bluebird

38220 просмотра

3 ответа

25862 Репутация автора

Я использую библиотеку Promise 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 Error('user not found'));
  })
  .then(function (user) {
    req.user = user;
    next();
  });

Но если возникает ошибка getSession, catchвызываются две , а также вторая then. Я хотел бы остановить распространение ошибки на первом catch, так что второе catchвызывается только при getUserбросках, а второе, thenкогда это getUserудается. Что?

Автор: Alexandre Kirszenberg Источник Размещён: 07.07.2014 08:38

Ответы (3)


18 плюса

355967 Репутация автора

Решение

Обещание, которое возвращается .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();
});

или использовать второй обратный вызов 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);
Автор: Bergi Размещён: 07.07.2014 08:58

6 плюса

350 Репутация автора

Поскольку вы используете 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);
  });

Предполагая, что сообщения об ошибках сообщают вам, что такое ошибка, по-прежнему можно отправить сообщение об ошибке, такое как «session not found» или «user not found», но вам просто нужно просмотреть сообщение об ошибке, чтобы увидеть, что он дает вы.

Примечание. Уверен, что у вас, вероятно, есть причина для вызова следующего, независимо от того, есть ли ошибка или нет, но может быть полезно запустить console.error (ошибка) в случае получения ошибки. Кроме того, вы можете использовать некоторую другую функцию обработки ошибок, будь то console.error или res.send (404) или что-то подобное.

Автор: Mercury Размещён: 07.07.2014 09:07

0 плюса

1 Репутация автора

Я использую его так:

getSession(x)
.then(function (a) {
    ...
})
.then(function (b) {
    if(err){
        throw next(new Error('err msg'))
    }
    ...
})
.then(function (c) {
    ...
})
.catch(next);
Автор: Burak Dalkıran Размещён: 14.11.2018 11:58
Вопросы из категории :
32x32