m.request: 确定XHR Failure的具体原因?
m.request: Determine specific cause of XHR Failure?
问题
当 mithril 的 m.request
由于超时或网络错误而失败时,错误 returned 只是 null
。这样就无法区分
- 超时
- 缺乏互联网连接
- 其他类型的错误。
有没有办法确定这些信息?
演示
在下面的代码片段中,请求每次都会超时,因为限制是 1 毫秒。错误 returned 是 null
。如果将其更改为 1000ms,它将起作用。如果您关闭 wifi 并重试,它将 return 另一个 null
错误。
const Test = {
controller: function() {
var user = m.prop('Waiting...');
var error = m.prop();
var args = {
method: 'GET',
url: "https://jsonplaceholder.typicode.com/users",
config: function(xhr) {
xhr.timeout = 1;
}
};
function refreshUser() {
m.request(args)
.then( users => user(users[0].name), error);
}
return { user, error, refreshUser};
},
view: function(ctrl) {
return m('div', [
m('div', 'Fetched User: ' + ctrl.user()),
m('div', 'Network Error: ' + ctrl.error()),
m('button', {onclick: ctrl.refreshUser }, 'Refresh User')
]);
}
}
m.mount(document.body, Test);
<script src="https://cdnjs.cloudflare.com/ajax/libs/mithril/0.2.5/mithril.min.js"></script>
您可以将一个名为 extract
的参数传递给 m.request
,它将包含 xhr 响应。希望你能在那里找到你需要的东西。
来自 m.request docs 的示例:
var extract = function(xhr, xhrOptions) {
if (xhrOptions.method == "HEAD") return xhr.getResponseHeader("x-item-count")
else return xhr.responseText
}
m.request({method: "POST", url: "/foo", extract: extract});
问题
当 mithril 的 m.request
由于超时或网络错误而失败时,错误 returned 只是 null
。这样就无法区分
- 超时
- 缺乏互联网连接
- 其他类型的错误。
有没有办法确定这些信息?
演示
在下面的代码片段中,请求每次都会超时,因为限制是 1 毫秒。错误 returned 是 null
。如果将其更改为 1000ms,它将起作用。如果您关闭 wifi 并重试,它将 return 另一个 null
错误。
const Test = {
controller: function() {
var user = m.prop('Waiting...');
var error = m.prop();
var args = {
method: 'GET',
url: "https://jsonplaceholder.typicode.com/users",
config: function(xhr) {
xhr.timeout = 1;
}
};
function refreshUser() {
m.request(args)
.then( users => user(users[0].name), error);
}
return { user, error, refreshUser};
},
view: function(ctrl) {
return m('div', [
m('div', 'Fetched User: ' + ctrl.user()),
m('div', 'Network Error: ' + ctrl.error()),
m('button', {onclick: ctrl.refreshUser }, 'Refresh User')
]);
}
}
m.mount(document.body, Test);
<script src="https://cdnjs.cloudflare.com/ajax/libs/mithril/0.2.5/mithril.min.js"></script>
您可以将一个名为 extract
的参数传递给 m.request
,它将包含 xhr 响应。希望你能在那里找到你需要的东西。
来自 m.request docs 的示例:
var extract = function(xhr, xhrOptions) {
if (xhrOptions.method == "HEAD") return xhr.getResponseHeader("x-item-count")
else return xhr.responseText
}
m.request({method: "POST", url: "/foo", extract: extract});