如何从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
。
答案 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))