2013-09-10 2 views
0

У меня есть этот код, чтобы сделать запрос ajax, но в соответствии с Chrome Inspector обратный вызов, связанный с запросом, вызывается дважды (этим я подразумеваю, что ответ дважды записывается в консоль) , Еще 2 журнала печатаются без какого-либо контента. Вот код:Ajax-вызов вызывает больше обратных вызовов, чем ожидалось

var ajax = { 
    pull: function (settings) { 
     settings.type = 'get'; 
     settings.callback = typeof (settings.callback) === 'function' ? settings.callback : false; 
     settings.data = settings.data ? settings.data : null; 
     return this.request(settings.url, settings.type, settings.callback, settings.data); 
    }, 
    request: function (url, type, callback, data) { 
     var ids = ['MSXML2.XMLHTTP.3.0', 
      'MSXML2.XMLHTTP', 
      'Microsoft.XMLHTTP'], 
      xhr; 
     if (window.XMLHttpRequest) { 
      xhr = new XMLHttpRequest(); 
     } else { 
      for (var i = 0; i < ids.length; i++) { 
       try { 
        xhr = new ActiveXObject(ids[i]); 
        break; 
       } catch (e) {} 
      } 
     } 
     if (callback) { 
      xhr.onreadystatechange = function() { 
       callback(xhr); 
      }; 
     } 
     xhr.open(type, url, true); 
     if (type.toUpperCase() === 'GET') { 
      xhr.send(); 
     } else if (type.toUpperCase() === 'POST') { 
      xhr.send(data); 
     } 
    } 
} 

ajax.pull({ 
    url: 'http://localhost/my/twtools/scripts/ajax.php', 
    callback: function (xhr) { 
     console.log(xhr.response); 
    } 
}); 

ответ

3

xhr.onreadystatechange имеет несколько шагов (пронумерованных от 0 сверху 4 я считаю, что-то вроде 0 = неинициализированным, 1 = начальная и т.д., хотя я не могу Rember точные названия шагов больше , быстрый google должен найти их), и каждый шаг вызывает ваш обратный вызов. Если я правильно помню, последний этап 4, так что я считаю, что вам нужно проверить что-то вроде этого

if (xhr.readyState == 4 && xhr.status == 200) 
{ 
// call has finished successfully 
} 

внутри вы обратного вызова, то есть, чтобы проверить, что все закончено и получил успешный ответ

Я был испорчен jQuery в эти дни (что намного проще сделать с jQuery), довольно давно, так как я написал raw ajax

+0

Я пытаюсь оставить JQuery на самом деле, это сделало меня ленивым человеком. Спасибо за помощь. – yoda

+0

Честно говоря, я согласен, что в наши дни я стараюсь использовать собственный JavaScript, имеет тенденцию работать лучше, хотя ajax и анимация - это две области, которые я не вернул. – OJay

+0

Я все еще езжу в своей машине, даже если это «лениво» "чем ехать на лошади или ходить 8 миль. –

2

Вы используете onreadystatechange, который вызывается более одного раза (после каждого изменения состояния) ,

Попробуйте использовать

xhr.onload = function() { 
    callback(xhr); 
}; 
Смежные вопросы