m.request: 确定XHR Failure的具体原因?

m.request: Determine specific cause of XHR Failure?

问题

当 mithril 的 m.request 由于超时或网络错误而失败时,错误 returned 只是 null。这样就无法区分

  1. 超时
  2. 缺乏互联网连接
  3. 其他类型的错误。

有没有办法确定这些信息?

演示

在下面的代码片段中,请求每次都会超时,因为限制是 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});