2014-12-03 111 views
1

我有這樣的代碼:如何在HTTP響應失敗時從JSON響應中讀取屬性?

$.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()。掌握了這些信息後,我如何才能從.fail()中的JSON中捕獲error密鑰以向用戶展示?

我發現這個代碼:

$.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,你在完成()方法 – 2014-12-03 17:31:00

+1

如果消息在'err.error',你爲什麼要訪問'err.Message'而不是?你爲什麼使用'eval()'來解析你的JSON? – 2014-12-03 17:34:32

+0

...你是什麼意思的「抓住」錯誤鍵?你是在拋出一個錯誤,還是這只是一個不幸的用法,'catch'這個詞有非常具體的含義? – 2014-12-03 17:36:48

回答

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; 
}); 

爲了證明這一點,看看在jQuery source code線781-798。如果參數data是一個函數,例如success回調,項目將被移位。但是,由於情況並非如此,因此每個參數都將按照它們在函數中出現的位置放入。

在第二個版本中,Ajax.succees將設置爲字符串'json'並且Ajax.dataType設置爲undefined。該版本的jqXHR.responseJSON將返回undefined,因爲它未被解析爲JSON。

然而,第一個版本返回一個JSON對象。


而且,你在你的代碼中寫道colose.log,而不是console.log。這可能是爲什麼無法獲得數據。

+0

'[,...]'表示可選。 – 2014-12-03 17:38:48

+0

'return false;'無用 – epascarello 2014-12-03 17:54:15

+0

所以這是我應該去的方式? @epascarello爲什麼?因爲回調經歷了'.fail()'並且它本身就是一個失敗? – ReynierPM 2014-12-03 18:00:59