2017-05-31 41 views
1

fetch()是在經典XMLhttpRequest()有很大的改進但我在想,如果我添加window.addEventListener('unhandledrejection', event => ···);index.android.jsindex.ios.js我可以從理論上我的諾言鏈中刪除所有我.catch()的,使僞全球承諾拒絕處理?我正在構建一個反應本機應用程序,嚴重依賴api調用,其中許多用戶令牌已通過身份驗證。當用戶登錄令牌時將存儲在異步存儲中,但每個令牌將在一段時間後過期。如果用戶打開應用程序並且無意中嘗試進行需要使用過期令牌進行身份驗證的調用,則我希望將用戶路由到登錄頁面,而不管調用的是什麼或調用了哪個組件。每個單獨的承諾鏈自己處理未經認證的調用。有沒有更好的方法來做到這一點?是否有可能創建一個僞全球承諾拒絕處理程序?

+0

這似乎是合理的。當你嘗試時發生了什麼? –

+0

我還沒有,我想在一個新的分支做它,以防萬一它不工作,所以我只是完成我目前的拉請求,我會在一個小時內嘗試。如果沒有人在那段時間內回覆,我會發布結論並解決問題。 –

回答

0

您可以在fetch之上進行自定義抽象,這將提供與API進行通信的方式,並且還具有一些業務邏輯,對於您來說,請求身份驗證令牌或進行重定向。然後在代碼的其餘部分使用這個抽象來進行API調用。這裏是一個小例子來驗證這個想法:

export default function request(url, options = {}) { 
    const req = fetch(url) 
    .then((response) => { 
     // Global response handler 

     // ... 

     // Hand response down the promise chain 
     return response; 
    }) 
    .catch((err) => { 
     // Global error handler 

     // Check error status and (make redirect/request auth token) 

     // Throw error down the promise chain if needed 
     throw err; 
    }); 

    // Returns a promise 
    return req; 
} 

然後你在你的代碼一樣fetch()使用它,而是你將能夠修改和擴展它爲你需要的任何時間。

request('http://example.com/api/post/1') 
    .then((response) => { 
    // "response" has whatever you returned from global handler 
    }) 
    .catch((err) => { 
    // "err" is whatever you've thrown from global handler 
    }); 
+0

這是一個好主意,如果我無法讓觀察者工作,我可能會這樣做。 –

相關問題