2011-07-21 51 views
21

我正在使用FormData來ajax文件上傳。上傳工作,但問題是從不調用「錯誤」回調。即使當我的HTTP響應是500內部服務器錯誤(爲了測試這個我調整服務器以500響應),調用「負載」回調。XMLHttpRequest始終調用「加載」事件偵聽器,即使響應有錯誤狀態

function upload_image() { 
    var form = document.getElementById('upload_image_form'); 
    var formData = new FormData(form); 

    var xhr = new XMLHttpRequest(); 
    xhr.addEventListener("load", function(e) { 
     alert("Success callback"); 
    }, false); 
    xhr.addEventListener("error", function(e) { 
     alert("Error callback"); 
    }, false); 
    xhr.open("POST", "/upload_image"); 
    xhr.send(formData); 
} 

任何想法?我正在Chrome上進行測試。

回答

19

此設置應該更好地爲您的需求:

var req = new XMLHttpRequest(); 
req.open('POST', '/upload_image'); 
req.onreadystatechange = function (aEvt) { 
    if (req.readyState == 4) { 
    if(req.status == 200) 
     alert(req.responseText); 
    else 
     alert("Error loading page\n"); 
    } 
}; 
req.send(formData); 

在你的代碼錯誤回調永遠不會被調用,因爲它只能通過網絡級別的錯誤引發的,它忽略了HTTP返回碼。

+1

不錯,這個工程!仍然好奇......但爲什麼不是我在上面的設置中調用過的「錯誤」回調? –

+0

我遇到了Chrome剛剛返回ajax響應的問題,非常奇怪。我得到的是200,但從未完成。 – Joe

+9

@simmbot錯誤回調從不被調用,因爲它只是由網絡級錯誤觸發,它忽略HTTP返回碼。 – Ferdy

8

只要服務器響應消息,就會調用加載事件。答覆的語義無關緊要;重要的是服務器的響應(在這種情況下是500的狀態)。如果您希望將錯誤語義應用於事件,則必須自己處理狀態。

0
function get(url) { 
return new Promise(function(succeed, fail) { 
    var req = new XMLHttpRequest(); 
    req.open("GET", url, true); 
    req.addEventListener("load", function() { 
    if (req.status < 400) 
     succeed(req.responseText); 
    else 
     fail(new Error("Request failed: " + req.statusText)); 
    }); 
    req.addEventListener("error", function() { 
    fail(new Error("Network error")); 
    }); 
    req.send(null); 
}); 
} 

code from EJS 由示例代碼 清楚的是網絡錯誤沒有響應時,它觸發錯誤事件。 響應觸發加載事件 ,你必須決定如何處理響應狀態

相關問題