【问题标题】:Is it possible to make a pseudo-global promise rejection handler?是否可以制作一个伪全局承诺拒绝处理程序?
【发布时间】:2017-11-01 12:46:18
【问题描述】:

fetch() 比经典的 XMLhttpRequest() 有了很大的改进 但是我想知道是否将 window.addEventListener('unhandledrejection', event => ···); 添加到我的 index.android.jsindex.ios.js 理论上我可以从我的承诺链中删除我的所有 .catch() 吗?制作一个伪全局承诺拒绝处理程序?我正在构建一个严重依赖 api 调用的本机应用程序,其中许多都使用用户令牌进行身份验证。当用户登录时,一个令牌存储在异步存储中,但每个令牌都会在一定时间后过期。如果用户打开应用程序并无意中尝试拨打需要使用过期令牌进行身份验证的呼叫,我希望用户被路由到登录页面,无论拨打了什么电话,或者电话所在的组件。我目前有每个单独的承诺链自己处理未经身份验证的调用。有没有更好的方法?

【问题讨论】:

  • 这似乎是合理的。当你尝试时发生了什么?
  • 我还没有,我想在一个新的分支上做,以防万一它不起作用,所以我刚刚完成我当前的拉取请求,我会在一个小时内尝试.如果在那段时间没有其他人回复,我将发布结论并解决问题。

标签: reactjs react-native es6-promise fetch-api


【解决方案1】:

您可以在 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
  });

【讨论】:

  • 这是个好主意,如果我不能让观察者工作,我可能会这样做。
猜你喜欢
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多