2014-12-03 2 views
1

У меня есть этот код:Как прочитать свойство из ответа JSON, когда ответ HTTP имеет код отказа?

$.post(Routing.generate('parMarcaModelo'), { 
    "marcaId": currBranch, 
    "modeloId": currModel, 
    "marcaNombre": currBranchName, 
    "modeloNombre": currModelName 
}, 'json').done(function (data, textStatus, jqXHR) { 
    // do something here 
}).fail(function (jqXHR, textStatus, errorThrown) { 
    // Catch error from server and logs to console 
    var err = eval("(" + jqXHR.responseText + ")"); 
    colose.log('Error', err.Message, 20000); 

    return false; 
}); 

на стороне сервера возвращает JSON как этот:

{ 
    "success":false, 
    "error":"El par Marca2-Modelo1 ya existe. Por favor escoja otra combinaci\u00f3n.", 
} 

Но и возвращает 400 код, Ajax вызов будет проходить через .fail() обратного вызова InstEd из .done(). Имея эту информацию, как я могу поймать ключ error от JSON в .fail(), чтобы показать пользователям?

Я нашел этот код:

$.get('http://localhost/api').then(function(res) { 
    var filter $.Deferred() 

    if (res.success) { 
     filter.resolve(res.data) 
    } else { 
     filter.reject(res.error) 
    } 

    return filter.promise() 
}).done(function(data) { 
    console.log('Name:', data.name) // Outputs: Foo 
}).fail(function(error) { 
    console.log('Error:', error) // Outputs: Something bad happened. 
}) 

На this тему на SO, но не знаю, если это право, а также если будет влиять на мой код в некотором образе.

Любая помощь или совет?

+0

Если вы получаете JSON, вы используете метод done() –

+1

Если сообщение находится в 'err.error', то почему вы получаете доступ к' err.Message' вместо этого? И почему вы используете 'eval()' для анализа вашего JSON? –

+0

... и что вы подразумеваете под словом 'catch'? Вы бросаете ошибку, или это просто неудачное использование слова 'catch', которое имеет очень специфический смысл? –

ответ

0

Вы отправляете 'json' в качестве функции обратного вызова успеха до $.post().

Это правильная функция подписи: jQuery.post(url [, data ] [, success ] [, dataType ])


Разъяснение

Этот код будет работать, так как она проходит в пустой функции вместо «успеха».

$.post('rest.php', {data : 'data'}, function(){},'json').done(
function (data, textStatus, jqXHR) { 
    // do something here 
}).fail(function (jqXHR, textStatus, errorThrown) { 
    // Catch error from server and logs to console 
    console.log('Error', jqXHR.responseJSON, 20000); 

    return false; 
}); 

Однако, этот код не будет:

$.post('rest.php', {data : 'data'}, 'json').done(
function (data, textStatus, jqXHR) { 
    // do something here 
}).fail(function (jqXHR, textStatus, errorThrown) { 
    // Catch error from server and logs to console 
    console.log('Error', jqXHR.responseJSON, 20000); 

    return false; 
}); 

Для доказательства, посмотрите на линии 781-798 в jQuery source code. Если параметр data является функцией, например. обратный вызов success, элементы будут сдвинуты. Однако, поскольку это не так, каждый параметр будет помещен в позицию, которую они отображают в функции.

Во второй версии Ajax.succees будет установлен на строку 'json', а Ajax.dataType - undefined. jqXHR.responseJSON этой версии вернет undefined, так как он не анализируется как JSON.

Первая версия, однако, возвращает объект JSON.


Кроме того, Вы писали colose.log вместо console.log в вашем коде. Возможно, поэтому не удалось получить данные.

+0

'[, ...]' означает необязательный. –

+0

'return false;' бесполезно – epascarello

+0

Итак, так я должен идти? @epascarello почему? потому что обратный вызов проходит через '.fail()', и это сам отказ? – ReynierPM

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

  • Нет связанных вопросов^_^