2017-01-18 6 views
2

Как часть API Node.js/Express Я разрабатываю, я создал собственный обработчик ошибок, который позволяет мне бросать определенные ошибки при необходимости, например. BadRequest или NotFound и т. Д.Node.js - исключение исключения в цепочке обещаний ES6

Проблема возникает, когда я хочу бросить в цепочку обещаний. Например:

db.doSomethingAsync().then(data => { 

    if(data.length === 0){ 
     throw new errors.ResourceNotFound({ resource: "foo" }); 
    } 
}); 

После большого чтения по теме, я вижу, что эта ошибка будет поглощена обещанием и, следовательно, вызывает необработанный отказ Promise.

Я знаю, что могу отклонить, но я не уверен, как я могу обработать конкретную ошибку (а не catchall on reject, которую я не хочу).

Кроме того, чтобы отказаться, мне не нужно было бы создавать новое обещание внутри моей цепи обещаний? Это кажется грязным.

Может ли кто-нибудь посоветовать, как обращаться с конкретным исключением в цепочке обещаний?

+0

В обещании цепи, вы возвращаете ошибки либо делать 'throw' или возврат отклоненного обещания. Либо изменит цепочку обещаний на отклоненное состояние, которое затем вы сможете обрабатывать на более высоком уровне в вашей цепочке обещаний. Где именно в цепочке для обработки ошибки зависит то, что вы пытаетесь выполнить. Но вы ДОЛЖНЫ обрабатывать отказ в цепочке обещаний где-то. Исключения в асинхронном режиме не могут быть пойманы где-либо еще, поэтому они служат мало полезной цели, не обрабатывая их где-то, а затем решают, что делать, когда это условие происходит. – jfriend00

ответ

2

В дополнение к первому обратному вызову , затем(), который выполняет обратный вызов и получает данные, вы также можете предоставить второй обратный вызов, который является откатом обратного вызова, и он получает ошибки. так что вы могли бы поймать эту конкретную ошибку на втором обратного вызова следующего затем:

db 
    .doSomethingAsync() 
    .then(data => { 
    if(data.length === 0){ 
     throw new errors.ResourceNotFound({ resource: "foo" }); 
    } 
    }) 
    .then(massagedData => { 
    // work with massagedData here 
    }, err => { 
    // handle err here which is previous thrown error 
    // assert.ok(err instanceof errors.ResourceNotFound()) 
    }) 
    .catch(err => { 
    // this will catch unhandled errors if any 
    }); 

затем() по умолчанию возвращает обещание, и если какой-либо из его обратных вызовов бросками (будь то первый или второй) ошибка, тогда он возвращает отклоненное обещание, и его причина будет улавливаться следующим откатом, если он есть или уловком в конце. Поэтому вам не нужно создавать новые обещания.

См Promise.prototype.then()

+1

Большое спасибо @ dNitro - пример был очень полезным. – Ben

Смежные вопросы