我在節點上運行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()
所有行動的承諾,並在那裏派遣錯誤行動。
有兩個缺點:
- 大量的代碼重複和
- 我需要知道在未來所有可能的錯誤。
所以我的問題是:有什麼辦法來創建一個全局錯誤處理程序,如果異步操作失敗,也會被調用,這樣我可以添加一些錯誤指示信息的狀態,它可以顯示?
用»storeEnhancer«或一些»中間件«可以實現嗎?
UPDATE
我能找到的東西是真正有用的:
process.on('unhandledRejection', (reason, promise) => {
console.log(reason.message);
});
,每當承諾被拒絕回調被觸發,不添加catch塊。現在,接縫可以做到這一點,不過無論如何,我更喜歡一個基本上完全相同的解決方案,但只適用於在store.dispatch()
內觸發的被拒絕的Promise,所以只有在動作/中間件/減速器處理中發生錯誤時在redux內即將發生。
看看[Promise.prototype.catch](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch)。 –
@OriDrori這是一個好主意,但對'prototype'進行黑客攻擊會感覺很痛苦,因爲我可能會比我想要的更多。 AKA內部節點? – philipp
你不需要破解原型。去鏈接,看看承諾的承諾如何工作。 –