2017-05-31 43 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

这是一个好主意,如果我无法让观察者工作,我可能会这样做。 –

相关问题