2017-01-18 51 views
2

作爲我開發的Node.js/Express API的一部分,我構建了一個自定義錯誤處理程序,可以讓我在需要時拋出特定的錯誤。 BadRequest或NotFound等。Node.js - 在ES6諾言鏈中拋出異常

當我希望拋出承諾鏈時,會出現問題。例如:

的話題多閱讀後,我看到這個錯誤將被承諾被吞噬,從而導致出現未處理的承諾拒絕。

我知道我可以拒絕,但我不知道我怎麼可以然後處理特定的錯誤(而不是拒絕我不想要的catchall)。

另外,要拒絕,我是否需要在我的承諾鏈中創建新的承諾?這感覺很混亂。

任何人都可以建議如何處理在承諾鏈中拋出特定異常?

+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