Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   XMLHttpRequest - wtf? (https://javascript.ru/forum/offtopic/44704-xmlhttprequest-wtf.html)

cyber 29.01.2014 21:20

XMLHttpRequest - wtf?
 
у XMLHttpRequest есть событие onerror, либо я чего то не в курю, либо по каким то магическим причинам оно не вызываеться при 404, тогда смысел от него если всеравно нужно обрабатывать "onloadend" ?

monolithed 29.01.2014 22:48

Цитата:

Сообщение от cyber
у XMLHttpRequest есть событие onerror, либо я чего то не в курю, либо по каким то магическим причинам оно не вызываеться при 404

А почему оно должно вызываться в этом случае?
404 это HTTP-статус ответа не более того.
Событие onerror вызывается когда происходит ошибка на сетевом уровне (не прошел коннект по причине политики безопасности, отсутствует соединение с сервером).

cyber 29.01.2014 23:06

Цитата:

Сообщение от monolithed
А почему оно должно вызываться в этом случае?
404 это HTTP-статус ответа не более того.
Событие onerror вызывается когда происходит ошибка на сетевом уровне (не прошел коннект по причине политики безопасности, отсутствует соединение с сервером).

я имел ввиду почему если файл нет файла то это не считаеться ошибкой?

monolithed 29.01.2014 23:35

Цитата:

Сообщение от cyber
я имел ввиду почему если файл нет файла то это не считаеться ошибкой

Это для тебя чего-то там нет, но твой сервер так не считает, т.к. прекрасно отдает ответ.
Статус ответа сервера может быть хоть 100500, и что считать ошибкой должен только ты и никто другой.

cyber 29.01.2014 23:37

Цитата:

Сообщение от monolithed
Это для тебя его чего-то там нет, но твой сервер так не считает, т.к. прекрасно отдает ответ.

хм, понятно.

Maxmaxmaximus7 30.01.2014 07:11

Цитата:

Сообщение от cyber
я имел ввиду почему если файл нет файла то это не считаеться ошибкой?

потому что этот обьект отвечает за соединения, а ошибки в соединении не было, был запрос на файл и пришел ответ что файла нет. запрос дошел? ответ дошел. ошибки нет. а вот ВЫШЕ УРОВНЕМ это уэе ты читаешь ответ, статус там и прочее, и решаел была ли это ошибка на уровне твоего приложения или нет. пнятна)?

Иными словами onerror это ошибка сетевого уровня. А ты ищешь ошибку уровня приложения) а это уже твоя головушка должна её отлавливать и обрабатывать) XMLHttpRequest о ней ничего не знает) он не знает что это ошибка)

То что ты спросил это то же самое что спросить "почему XMLHttpRequest не отлавливает ошибку ведь пользователь с таким именем уже существует)?"

я бы тебе рекомендовал для работы с сервером написать свой обьект) который бы генерировао ошибки повыше уромнем. у него были бы методы, промисы и прочее) ну ты пони. работа с api серевра на уровне приложения

cyber 30.01.2014 20:17

Цитата:

Сообщение от Maxmaxmaximus7
ну ты пони

сам ты пони:)

Maxmaxmaximus7 30.01.2014 20:21

ты пони

cyber 30.01.2014 20:39

Цитата:

Сообщение от Maxmaxmaximus7
ты пони

нет, ты и вообще обоснуй почему я пони?

cyber 30.01.2014 20:42

Maxmaxmaximus7, не могу найти, в js есть свой класс ошибок что типо HttpError или самому нужно замутить?)

Maxmaxmaximus7 30.01.2014 21:44

ну если ты хочешь обрабатывать брошенные api ошибки конструкцией try catch, то создавай свой класс ошибок.

Нормальный бы пасан создал класс

function ServerAPI (url){
    this.getComments = function(){ /*запрос на сервер*/ }
    this.postComment = function(text){ /*запрос на сервер*/ }
}


и оба эти метода возвращают промис обьект. у которого есть 2 метода "then" и "error". типа вот так:

var api = ServerAPI('/api.php');

api.postComment('ololo')
    .then(function(){ alert('отправлено') })
    .error(function(){ alert('ошибка') });



суть http://habrahabr.ru/post/209662/

Maxmaxmaximus7 30.01.2014 22:07

или создай класс для создания ассинхронных API к чему либо)) 'bv классом можно будет конструировать апихи ^_^

// поехали


  function API( props ) {
    /* подумай что сюда нужно написать =) тут вся магия */
  }



  var api = new API( {

    url: 'api.php',

    getComments: function( resolve, reject ) {

      var http = new XMLHttpRequest();

      http.onerror = function() {
        reject();
      };

      http.onload = function() {
        if (http.status === 200) {
          resolve();
        }
        else {
          reject();
        }
      };

      http.open( 'GET', this.url + '?comments' );
      http.send( null );
    }

  } );

Maxmaxmaximus7 30.01.2014 22:15

можно чо нить типа того намутить чтобы каждый раз не описывать создание этого обьекта запросов ^_^


var api = new API( {


    url: 'api.php',


    sendRequest: function( resolve, reject, requestParams ) {

      var http = new XMLHttpRequest();
      http.open( 'GET', this.url + '?' + requestParams );

      http.onerror = reject;
      http.onload = function() {
        http.status === 200 ? resolve() : reject();
      };

      http.send( null );
    },


    getComments: function( resolve, reject ) {
      return this.sendRequest( 'comments' ).then( resolve ).error( reject );
    }


  } );

cyber 30.01.2014 22:18

Maxmaxmaximus7, мне нужно прочитать json файл.
сделал так

function HTTPError(obj) {
        if(!obj) return;

        if(obj.hasOwnProperty("code")
            && obj.hasOwnProperty("text")) {
            obj.text = this.messages[obj.code] || obj.text;
        }

        for(var key in obj){
            if(obj.hasOwnProperty(key))
                this[key] = obj[key];
        }
    };

    HTTPError.prototype.messages = Object.create({
        "404": "Страница не найдена"
    });

pages.prototype.getFile = function(src, onload, onerror) {
      var xhr = new XMLHttpRequest();
          xhr._src = src;
          xhr.onreadystatechange = function(e){

              if(this.readyState != 4) return;

              if(xhr.status == 200) {
                  return onload.call(this, e);
              }

              onerror.call(this, new HTTPError({
                  text: this.statusText,
                  code: this.status,
                  object: this
              }), e);
          };

          xhr.open("GET", src);
          xhr.send(null);
      return xhr;
    };

Maxmaxmaximus7 30.01.2014 22:18

чтобы понять всю эту истину тебе надо прочесть ту статью про промисы и написать свой велосипед) я тоже думаю написать свой чтобы скилл поднять, хотя хер знат подымет ли, я вроде уже знаю как это все написать, не оказалось бы это пустой тратой времени

статья http://habrahabr.ru/post/209662/

Maxmaxmaximus7 30.01.2014 22:20

но ты сделал тупо, тебе придется ловить исключения а это уродливо смотрится, вся конструкция трай катч уродливая.

cyber 30.01.2014 22:23

Цитата:

Сообщение от Maxmaxmaximus7
но ты сделал тупо, тебе придется ловить исключения а это уродливо смотрится, вся конструкция трай катч уродливая.

зачем ловить? Запрос ассинхронный, а в консоль ввыведит всеравно, поэтому ловить не вижу смысла.

cyber 30.01.2014 22:34

Не могу понять что за хрень с кодировкой в js файле есть русская строка, и при попытки ее вывести получаю крякозябры, пробыл менять кодировку на 1251, не помогло, при том что в *.html все норм. wtf?

melky 30.01.2014 22:37

меняй на UTF-8

вообще, юзай везде UTF-8 и не знай проблем

cyber 30.01.2014 22:40

Цитата:

Сообщение от melky
меняй на UTF-8

вообще, юзай везде UTF-8 и не знай проблем

эм, у меня по умолчанию стояла utf-8 из за того что не работало поставил 1251, вот в чем проблема...

melky 30.01.2014 22:48

Цитата:

Сообщение от cyber (Сообщение 295011)
эм, у меня по умолчанию стояла utf-8 из за того что не работало поставил 1251, вот в чем проблема...

в хроме смотришь?

мета тег с кодировкой проставлен?

Maxmaxmaximus7 30.01.2014 22:51

Цитата:

Сообщение от cyber
зачем ловить? Запрос ассинхронный, а в консоль ввыведит всеравно, поэтому ловить не вижу смысла.

мда, ты оказывается еще вообще зеленый, даже не понимаешь о чем я, проехали, до промисовтебе долеко пока, забудь.

cyber 30.01.2014 22:53

Цитата:

Сообщение от melky
мета тег с кодировкой проставлен?

Естественно, и utf-8 ставил и 1251.

cyber 30.01.2014 22:57

Цитата:

Сообщение от Maxmaxmaximus7
мда, ты оказывается еще вообще зеленый, даже не понимаешь о чем я, проехали, до промисовтебе долеко пока, забудь.

хм, я походу тебя не понял, у меня вокруг getFile обертка с try catch, если XMLHttpRequest выбросит исключение оно будет обработано выше, поэтому мне не нужно внутри getFile его ловить, если файл не загружен, продолжать выполение скрипта нет смысла.

cyber 30.01.2014 23:11

melky, решил проблему, нужно было установить utf-8 без BOM, в phpstorm не было такого варианта, пришлось через sublime text

melky 30.01.2014 23:12

Цитата:

Сообщение от cyber (Сообщение 295019)
melky, решил проблему, нужно было установить utf-8 без BOM, как ни странно такая штука есть только в notepad++

о Боже, я думал оно кануло в лету)

cyber 30.01.2014 23:14

не только в notepad++, сразу не нашел:)

Maxmaxmaximus7 31.01.2014 02:24

cyber, я тебе описываю как органиховать общение между сервером и клиентом, и как это делают отцы. а не то как чо то там ловить и катчить. ты показал пример и спросил "норм?" я сказал "нет, отцы делают вот так" и показал server api и на фьючерсах.

Цитата:

Сообщение от cyber
в phpstorm не было такого варианта

он создает автоматически без бом, если быть точнее ВСЕ кроме блакнота стандартного создают без бом, во вторых в шторме даже кнопка специальная есть "удалить все BOM" когда тыкаешь правой кнопкой попапкам и файлам.

cyber 31.01.2014 02:57

Цитата:

Сообщение от Maxmaxmaximus7
"удалить все BOM" когда тыкаешь правой кнопкой попапкам и файлам

сенк, не обратил внимание.
Цитата:

Сообщение от Maxmaxmaximus7
cyber, я тебе описываю как органиховать общение между сервером и клиентом, и как это делают отцы. а не то как чо то там ловить и катчить. ты показал пример и спросил "норм?" я сказал "нет, отцы делают вот так" и показал server api и на фьючерсах.

Есть моменты, котогда есть смысел реализовать подобную структуру, есть когда лично я не вижу смыслу. Зачем писать отдельный велик что бы прочитать json файл?

Maxmaxmaximus7 31.01.2014 03:09

кто то говорит тебе писать велик чтобы прочитать json файл?

cyber 31.01.2014 03:13

Maxmaxmaximus7, ты же скидывал ссылку на then, я знаю про него но с учетом поддержки и того что прийдеться фолбечить, то лучше использовать то что есть.

Maxmaxmaximus7 31.01.2014 03:27

cyber, ты вообще о чем? ты прислал пример того как ты сделал, спросил нормально? я говорю нет - говно. если ты просто собираешься прочесть json то блять это делается так:

new xhr = new XHR();
xhr.open('GET', 'file.json');
xhr.send(null);
xhr.onload = function(){
   if(this.status !== 200) throw 'алярма блять';

   /*читаем файл*/

}

cyber 31.01.2014 03:48

Цитата:

Сообщение от Maxmaxmaximus7
сли ты просто собираешься прочесть json то блять это делается так:

и обработать ошибки и все, я так и сделал ...
Цитата:

Сообщение от Maxmaxmaximus7
спросил нормально?

там не было вопроса:)

Maxmaxmaximus7 31.01.2014 11:18

Цитата:

Сообщение от cyber
сделал так

зачем ты написал как ты сделал? не чтобы ли услышать критику? тогда зачем?

cyber 31.01.2014 14:18

Цитата:

Сообщение от Maxmaxmaximus7
зачем ты написал как ты сделал? не чтобы ли услышать критику? тогда зачем?

скучно было)

Maxmaxmaximus7 31.01.2014 14:27

окей, тогда так, ты выложил что-то на обзор общественности, общественность обсуждает) проблемы?

cyber 31.01.2014 15:14

Цитата:

Сообщение от Maxmaxmaximus7
окей, тогда так, ты выложил что-то на обзор общественности, общественность обсуждает) проблемы?

радуга и розовые пингвины...

Maxmaxmaximus7 31.01.2014 15:52

Цитата:

Сообщение от cyber
радуга и розовые пингвины...

и двойной капучино


Часовой пояс GMT +3, время: 15:45.