Думаю, я понял это, узнав несколько вещей о том, как обрабатывается этот тип запроса:
Статус для локальных файлов всегда "0" (не 200,и т. д.).
, если async имеет значение true, исключение не будет выдано, если файл не найден.
кажется, что по какой-то причине пропускается readyState 3 - если async имеет значение false, readyState идет прямо к 4.
, если первая частьURL-адрес chrome (имя расширения) не существует, он создает исключение для open()
.
Если async имеет значение false и файл не существует, он создает исключение для onreadystatechange
.
Если async имеет значение false и файл существует, прерывание onreadystatechange останавливает его фактическое чтение файла.
Итак, похоже,go is async = false, прервать после успешного изменения ReadyState (до 4) и вернуть true (файл существует).Если при open или onreadystatechange существует исключение, верните false (не существует).
Вот код, который, по-видимому, прерывается, пока xmlhttp.responseXML
все еще null
, если файл существует, и выдаетисключение, если это не так:
function chromeFileExists(fileLoc) // in extension package
{
var xmlhttp = new window.XMLHttpRequest();
try {
xmlhttp.open("GET", "chrome://"+fileLoc, false);
xmlhttp.onreadystatechange=function() {
xmlhttp.abort();
}
xmlhttp.send(null);
}
catch(ex) {
return false;
}
return true;
}