Обещает основы обработки ошибок

Предположим, у меня есть такой код, если db.get() - обещанный API:

var promises = [];
for( var i = 0; i < 10; i++ ){
    promises.push( getFromDatabase("age") );
}
Q.all(promises).then(function(results){
    // something
},function(error){
    log.error( error )
});

function getFromDatabase(property){
    return db.get(property).then(function(result){
        return result;
    },function(error){
        log.error( error )
    })
}  

Кто исправит ошибку? Функция в цепочке обещаний Q.all() или функция в цепочке обещаний getFromDatabase().

Кроме того, если есть обработчик ошибок верхнего уровня, как в Q.all(), есть ли необходимость в обработке ошибок во вспомогательных функциях?


person An SO User    schedule 22.05.2016    source источник
comment
Вероятно, вам следует передать null вместо функции идентификации в then или просто использовать catch.   -  person Bergi    schedule 22.05.2016
comment
См. Также этот вопрос о связывании catch.   -  person Bergi    schedule 22.05.2016


Ответы (1)


Кто исправит ошибку? Функция в цепочке обещаний Q.all () или функция в цепочке обещаний getFromDatabase ().

Если в вопросе указан ваш код, ошибки будут обрабатываться обработчиками ошибок getFromDatabase(). Но в вашем случае ошибки также не будут распространяться дальше на Q.all(), потому что вы в основном обрабатываете ошибку там и никогда не передаете ошибку дальше.

Кроме того, если есть обработчик ошибок верхнего уровня, как в Q.all (), есть ли необходимость в обработке ошибок во вспомогательных функциях?

Это зависит от вашей бизнес-логики, какого поведения вы хотите от своего приложения. Возможно, вы хотите зарегистрировать ошибку во внутреннем getFromDatabase обработчике ошибок и передать ошибку во внешний обработчик для получения правильного сообщения об ошибке для рендеринга пользовательского интерфейса. Вам решать. Но в этом случае вам нужно будет повторно выбросить ошибку или вернуть отклоненное обещание из внутреннего обработчика:

Q.all(promises).then(function(results){
    // something
},function(error){
    // Render error message for UI, etc.
});

function getFromDatabase(property){
    return db.get(property).then(function(result){
        return result;
    },function(error){
        // just log here
        log.error(error);
        throw error;
    })
} 
person dfsq    schedule 22.05.2016
comment
так что function(err){} больше похож на try-catch. Если его обработать глубоко внутри и теперь бросить, он не будет распространяться наверх. Правильно? - person An SO User; 22.05.2016
comment
Да, чтобы передать ошибку следующему обработчику в цепочке (наверху), вам нужно либо вернуть отклоненное обещание, либо бросить. Отсутствие возврата ничего подобного в вашем коде эквивалентно разрешенному обещанию, что означает, что вы обработали ошибку. - person dfsq; 22.05.2016
comment
что, если у вспомогательной функции нет обработчика ошибок? - person An SO User; 22.05.2016
comment
Вы имеете ввиду getFromDatabase функцию? Затем ошибка напрямую переходит к следующему обработчику ошибок в цепочке, в вашем случае Q.all. - person dfsq; 22.05.2016
comment
Так что гораздо проще просто пропустить внутренние обработчики ошибок и позволить им всплыть наверх, верно? - person An SO User; 22.05.2016
comment
Да, если вас не интересует обработка ошибок для конкретного запроса в собственном обработчике ошибок. - person dfsq; 22.05.2016