RxJS 5:如何在catch上获取statusCode

时间:2017-11-21 23:25:25

标签: ajax rxjs redux-observable

如何从RxJS中失败的ajax调用中获取状态代码,以便我可以决定如何处理它?<​​/ p>

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,但无论statusCode如何,它始终为0

2 个答案:

答案 0 :(得分: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) })

答案 1 :(得分:-1)

根据文件: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))