2011-07-21 10 views
21

Używam FormData do ajaxa przesłania pliku. Przesyłanie działa, ale problem polega na tym, że wywołania zwrotne "błąd" nigdy nie są wywoływane. Nawet gdy moja odpowiedź HTTP jest błędem wewnętrznego serwera 500 (w celu przetestowania tego, poprawiam serwer, aby odpowiedzieć na 500), wywoływane jest wywołanie zwrotne "load".XMLHttpRequest wywołuje zawsze detektor zdarzeń "ładuj", nawet jeśli odpowiedź ma status błędu

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

Wszelkie pomysły? Testuję to w Chrome.

Odpowiedz

19

Taka konfiguracja powinna działać lepiej dla Twoich potrzeb:

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

W swojej zwrotnego kod błędu nie jest nazywany, ponieważ jest wyzwalane tylko przez błędy na poziomie sieci, ignoruje kody powrotu HTTP.

+1

Fajnie, działa! Ciągle ciekawy ... dlaczego wywołanie zwrotne "błędu" nie zostało wywołane w powyższej konfiguracji? –

+0

Miałem problemy z chrome tylko zwracające odpowiedzi ajax bardzo dziwne. Dostałem 200, ale nigdy nie zostało ukończone. – Joe

+9

@simmbot Odwołanie błędu nigdy nie jest wywoływane, ponieważ jest ono wyzwalane tylko przez błędy na poziomie sieci, ignoruje kody powrotu HTTP. – Ferdy

8

Zdarzenie load jest wywoływane za każdym razem, gdy serwer odpowiada komunikatem. Semantyka odpowiedzi nie ma znaczenia; ważne jest to, że serwer odpowiedział (w tym przypadku na status 500). Jeśli chcesz zastosować semantykę błędu do zdarzenia, musisz samemu przetworzyć status.

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 kodem np jasno wynika, że ​​błąd sieci nie ma odpowiedzi, to wywołać zdarzenie błędu. wyzwalacz odpowiedzi zdarzenia obciążenia i musisz zdecydować, co zrobić ze statusem odpowiedzi

Powiązane problemy