【问题标题】:RxJS 5: how to get statusCode on catchRxJS 5:如何获取状态码
【发布时间】:2018-05-05 14:01:54
【问题描述】:

如何从 RxJS 中失败的 ajax 调用中取回状态码,以便我决定如何处理它?

import { ajax } from 'rxjs/observable/dom/ajax'

ajax('https://my.url')
  .map(xhr => console.log('woo', xhr.response))
  .catch(err => console.log('status code??'))

err 响应中有一些字段,其中之一是 status,但无论状态码如何,它始终是 0

【问题讨论】:

    标签: ajax rxjs redux-observable


    【解决方案1】:

    编辑:

    我错过了您看到 error.status 的事实,所以问题就是为什么它为零。

    这是一个浏览器的事情。 It's zero by default,只有在请求实际返回时才会更改。如果由于任何原因未完成,则保持为零。这包括中止的请求、CORS 问题、离线、DNS 问题和任何其他网络错误。这是有道理的,因为大多数情况下都没有 HTTP 代码。 CORS 请求错误本身可能有 401(或其他代码),但浏览器不会以编程方式将其公开给您。

    不幸的是,当这种情况发生时,您无法通过编程来了解导致它的原因。你可以检查navigator.onLine,如果它是假的,可能会推断它是由于没有连接到互联网造成的,尽管这不是 100% 可靠的。

    在其他情况下,您以编程方式搞砸了。没有带有解释或其他方式的错误消息属性。错误的真正原因通常是在开发控制台中(因此请检查那里),但出于安全原因无法以编程方式访问。

    这里有一些关于此的额外资源:


    在 v5 中(至少在 v4 中),状态可作为提供的错误对象的顶级属性 status

    import { ajax } from 'rxjs/observable/dom/ajax'
    
    ajax('https://my.url')
      .map(xhr => console.log('woo', xhr.response))
      .catch(err => {
        console.log('status code', error.status);
        // also available as error.xhr.status (inside the raw XMLHttpRequest object)
        return Observable.empty(); // switch to an empty stream i.e. swallow error
      });
    

    请注意,catch 用于捕获错误然后切换到您必须返回的其他 Observable。所以必须处理错误。如果不想处理错误,只想记录错误,可以使用do

    ajax('https://my.url')
      .map(xhr => console.log('woo', xhr.response))
      .do({ error: err => console.log('status code', err.status) })
    

    【讨论】:

    • 你在推特上说:“我已经在我的问题中提到了状态字段,它总是'0',我想要响应 statusCode 例如 401”
    • 对不起,我错过了那部分。编辑了我的答案。
    • 太棒了,现在说得通了..即使有点烦人。
    【解决方案2】:

    根据文档:https://github.com/Reactive-Extensions/RxJS-DOM/blob/master/doc/operators/ajax.md

    你可以像下面这样:

    ajax('https://my.url')
      .map(xhr => console.log('woo', xhr.response))
      .catch((err, status) => console.log(status))
    

    【讨论】:

    • 该链接指向 rxjs v4,而不是 v5,但在 v4 和 v5 中,错误对象本身的 status 属性相同,而不是第二个参数。在 v4 中,第二个参数什么都没有(未定义),但在 v5 中,它是应用了 catch 的源 observable。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    相关资源
    最近更新 更多