2013-12-03 4 views
0

Я использую следующий JQuery сделать вызов Ajax:Ajax .done() нет данных

$.ajax({ 
    url: "/projects/project/xGetProjectStatus", 
    type: "GET", 
    dataType: "json"}) 
    .done(function(request){ 
      alert(request.responseText); 
      var data = JSON.parse(request.responseText); 
      if(data.success){ 
        //stuff here 
      } 
}) 

Предупреждение всплывал всегда говорит, что responseText не определено. Страница, которую я получаю, хорошо отформатирована JSON, и если я запускаю эти команды в консоли по одному, все работает нормально. Что не так?

+1

Что делает 'console.log (request)' say? – PSL

+0

'request' не имеет свойства' responseText', если вы не предоставите его на стороне сервера. –

+1

@KevinB Я знаю ... :) Я просил OP распечатать его ... Так что поймет, что он получает, это то, что он ожидает как «responseText», но как проанализированный Object. – PSL

ответ

2

Вы ищете responseText в ответ, это не будет. Вы найдете его вместо этого на самом объекте jqXHR (который является третьим параметром, переданным вашей функции done(), а также возвращается всем вашим звонком $.ajax()).

И поскольку у вас есть dataType: "json", ответ уже является разобранным объектом JSON.

Изменить это:

.done(function(request){ 
    alert(request.responseText); 
    var data = JSON.parse(request.responseText); 
    if(data.success){ 
      //stuff here 
    } 
}) 

Чтобы только это:

.done(function(data){ 
    if(data.success){ 
      //stuff here 
    } 
}) 
0

Когда вы устанавливаете dataType в вызове jQuery.ajax, он будет возвращен как разобранный объект. Таким образом, ваш request объект в .done на самом деле ваша разобран json строка

Если вы не хотите jQuery автоматически разобрать ваш JSON вы можете удалить тип данных из вызова.

$.ajax({ 
    url: "/projects/project/xGetProjectStatus", 
    type: "GET" 
}).done(function(request){ 
    alert(request.responseText); 
    var data = JSON.parse(request.responseText); 
    if(data.success){ 
     //stuff here 
    } 
}) 
+0

Извлечение 'dataType' не приведет к работе кода, как вы показали. Прежде всего, если вы не дадите 'dataType', jQuery попытается угадать на основе типа MIME. Если URL-адрес возвращает заголовок 'Content-type: application/json', тогда jQuery будет разбирать его для вас в любом случае. Во-вторых, свойство 'responseText' находится на объекте' jqXHR', который * NOT * 1-й параметр. Это должен быть третий параметр: '.done (function (data, status, jqXHR) {})'. –

0

Это происходит потому, что первый параметр проделанного функции не является объектом XHR, но содержимое responseText как объект уже , jQuery обрабатывает все, что для вас, и поэтому нет необходимости в ручном преобразовании.

Выполненная функция вызывается всякий раз, когда вызов ajax выполняется в любом случае, поэтому нет необходимости повторно проверять его, и функция отказа вызывается, когда возвращается ответ, отличный от 200.

+0

Он не «перепроверяет», если он был успешным. Он проверяет свойство «success» объекта, который он извлек из вызова AJAX. –

+1

Ahh ok, хорошо лично, я бы предпочел использовать коды состояния, чтобы диктовать, была ли операция успешной, вместо того, чтобы передавать ее как bool в json-объекте. Верните 200, если операция была успешной, верните еще один 40x код состояния, если возникла проблема. Уменьшает размеры полезной нагрузки, удаляя в заголовок информацию о подобном перемещении. – Nemesis02

Смежные вопросы