2015-12-09 5 views
0

Это одна сбивает с толку, чтобы описать, так что я просто положить видеоmithril.js умирает после того, как m.request получает ошибку

https://dl.dropboxusercontent.com/s/ju485susn7ypsgx/2015-12-09_15-03-50.mp4?dl=0

Когда я выключите сервер, m.request бросает ошибки (очевидно) net::ERR_CONNECTION_REFUSED

  1. Как я могу справиться с этими ошибками и просто превратить данные в пустой массив [] (я знаю .then принимает успеха и неудачи обратного вызова, но это, кажется, не работает)
  2. Почему приложение не работает после того, как я верну сервер? (Кажется, проблема в том, что m.route перестает работать?)
+0

Я думаю, что может случиться так, что ошибка предотвращает выполнение m.redraw. Мифриловое обещание m.request не включает в себя улов - вы можете либо использовать лучшую библиотеку ajax, которая имеет улов (я люблю мифрил, но m.request - это беспорядок), либо оберните ваш m.request в обещание и поймать любые ошибки. Затем вы можете разрешить с пустым массивом и вызвать m.redraw вручную (я не знаю, если это будет необходимо). – dcochran

+0

@dcochran Я нашел конкретную проблему прямо здесь: http://i.imgur.com/HaXEKBO.png 'deserialize'' 'JSON.parse', это на самом деле в блоке' try' ... Как это возможно что эта ошибка не поймана !? http://i.imgur.com/kZ74Arv.png –

ответ

1

Я исправил это, отредактировав источник mithril.js. Мне пришлось обернуть звонок m.endComputation внизу в блоке finally.

Не понимаю, почему try/catch не работает, и почему это finally не требуется. Но я думаю, что я опубликую его как ошибку.

xhrOptions.onload = xhrOptions.onerror = function(e) { 
     try { 
      e = e || event; 
      var unwrap = (e.type === "load" ? xhrOptions.unwrapSuccess : xhrOptions.unwrapError) || identity; 
      var response = unwrap(deserialize(extract(e.target, xhrOptions)), e.target); 
      if (e.type === "load") { 
       if (type.call(response) === ARRAY && xhrOptions.type) { 
        for (var i = 0; i < response.length; i++) response[i] = new xhrOptions.type(response[i]) 
       } 
       else if (xhrOptions.type) response = new xhrOptions.type(response) 
      } 
      deferred[e.type === "load" ? "resolve" : "reject"](response) 
     } 
     catch (e) { 
      m.deferred.onerror(e); 
      deferred.reject(e) 
     } finally { 
// This is now in a finally block 
      if (xhrOptions.background !== true) m.endComputation() 
     } 
    }; 
+1

Собственно, это ожидаемое поведение, и я однажды подал это как ошибку, достаточно смешно: https://github.com/lhorie/mithril.js/issues/780 Как я уже сказал, m.request - это беспорядок. Вам нужно передать опцию extract в ваш m.request (см. Ссылку). – dcochran

+1

@ dcochran Wth ?! Они глупы, особенно учитывая, что я исправил это, просто добавив блок «finally». Об этом я поговорил с некоторым участником, и я думаю, что он собирается подтолкнуть исправление, а также очистит некоторые из грязных аякс-кодов. –