2017-07-25 198 views
0

我在節點上運行REDX。爲了處理異步操作,如讀取文件或目錄列表,我將redux-thunk與Promises結合使用。因此,一個典型的動作可以看起來像:Redux全局錯誤處理程序

const 
    fs = require('fs'), 
    { promisify } = require('util'), 
    readdir = promisify(fs.readdir); 

const listFiles = dir => dispatch => 
    readdir(dir) 
    .then(files => dispatch({ 
     type: '…', 
     payload: { files } 
    })); 

所以:

try { 
    store.dispatch(listFiles('/some/path')); 

catch (error) { 
    //some rescue plan here, 
    //won't work if directory not exists 

} 

不會在這裏工作,因爲動作是異步的,現在,我看到處理所有的錯誤的唯一方法是添加一個.catch()所有行動的承諾,並在那裏派遣錯誤行動。

有兩個缺點:

  1. 大量的代碼重複和
  2. 我需要知道在未來所有可能的錯誤。

所以我的問題是:有什麼辦法來創建一個全局錯誤處理程序,如果異步操作失敗,也會被調用,這樣我可以添加一些錯誤指示信息的狀態,它可以顯示?

用»storeEnhancer«或一些»中間件«可以實現嗎?

UPDATE

我能找到的東西是真正有用的:

process.on('unhandledRejection', (reason, promise) => { 
    console.log(reason.message); 
}); 

,每當承諾被拒絕回調被觸發,不添加catch塊。現在,接縫可以做到這一點,不過無論如何,我更喜歡一個基本上完全相同的解決方案,但只適用於在store.dispatch()內觸發的被拒絕的Promise,所以只有在動作/中間件/減速器處理中發生錯誤時在redux內即將發生。

+0

看看[Promise.prototype.catch](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch)。 –

+0

@OriDrori這是一個好主意,但對'prototype'進行黑客攻擊會感覺很痛苦,因爲我可能會比我想要的更多。 AKA內部節點? – philipp

+0

你不需要破解原型。去鏈接,看看承諾的承諾如何工作。 –

回答

0

如果您正在尋找redux中間件解決方案,請查看redux-catch

+0

這是一個»錯誤捕獲中間件的Redux減速器和同步中間件«,但我也擔心異步操作... – philipp

+0

啊,你說得對。 –