2015-07-26 1 views
2

У меня есть модуль AMD, который выполняет основную проводку Ajax. Он работает, он будет отправлять на мой сервер api, однако событие onreadystatechange просто не срабатывает. Вы можете увидеть, что я делаю неправильно? ...XHR onreadystatechange никогда не срабатывает

define(['constants'], function (cons) { 
    'use strict'; 

    function _getHTTPObject() { 
     var http = false; 
     // Use IE's ActiveX items to load the file. 
     if (typeof ActiveXObject !== 'undefined') { 
      try {http = new ActiveXObject("Msxml2.XMLHTTP");} 
      catch (e) { 
       try {http = new ActiveXObject("Microsoft.XMLHTTP");} 
       catch (E) {http = false;} 
      } 
     // If ActiveX is not available, use the XMLHttpRequest of Firefox/Mozilla etc. to load the document. 
     } else if (XMLHttpRequest) { 
      try {http = new XMLHttpRequest();} 
      catch (e) {http = false;} 
     } 
     return http; 
    } 

    function _send (url, params, cbSuccess, cbError) { 
     var http = _getHTTPObject(); 
     http.open("POST", url, true); 
     // Send the proper header infomation along with the request 
     http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     http.onreadystatechange = function (cbSuccess, cbError) { 
      if (http.readyState === 4 && http.status === 200) { 
       if (console) { console.log('xhrPost response:', http.responseText); } 
      } 
     } 
     http.send(params); 
    } 

    return { 
     send: _send 
    }; 

}); 
+0

Примечания: Вы просто не нужен '_getHTTPObject' если вы не поддерживаете действительно удивительно устаревшие браузеры, как IE6. –

+0

Это не проблема, но это проблема * next *: вы не хотите объявлять 'cbSuccess' и' cbError' в своей подписи обработчика 'onreadystatechange'. –

+0

Я думал об этом. Однако я хочу добавить способ вернуть успех или ошибку. Итак, вы не думаете, что сигнатура функции вызывает событие? – Locohost

ответ

1

Хорошо ... Так что после того, как много возиться с JavaScript, я, наконец, увидел проблему. Мой сервер api post route, с которым я тестировал, не возвращал ответ об успехе, просто по ошибке, так что навсегда потребовалось это увидеть.

Так выше код отлично: -/

Вот код маршрута разорвать узел, если кому-то интересно. Я должен был добавить return res.json(... линии после того, как игрок сохранить успех, чтобы получить правильный readyState к огню ...

app.post('/api/player/create', function (req, res) { 
    var player = new Player({ 
      'firstName': req.body.firstName, 
      'lastName': req.body.lastName, 
      'handle': req.body.handle, 
      'email': req.body.email 
     }); 
    player.save(function (err) { 
     if (!err) { 
      log.logOK('New player joined! (%0)', req.body.handle); 
      return res.json({ 'error': '' }); // <== This was missing 
     } else { 
      log.logER('Create new player failed, error (%0): %1', req.player.handle, err); 
      return res.json({ 'error': err }); 
     } 
    }); 
});