LINUX.ORG.RU

XMLHttpRequest проверка файла

 , ,


0

1

Привет, ЛОР.
В JS'ах и QML'ях не силён. Есть код, который с помощью XMLHttpRequest открывает json файл, а дальше он парсится.

function request(url, callback)
{
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = (function(myxhr)
    {
        return function()
        {
            if(myxhr.readyState === 4) callback(myxhr);
        }
    })(xhr);
    xhr.open('GET', url, true);
    xhr.send('');
}
И вызывается так
request("./camera-resolutions.json", function(o)
{
...
}
Мне надо сначала проверить на наличие файл в другой директории и открыть его (или второй, если файла нет).
Пробовал аналогичным способом проверять
function ifFileExist(url)
{
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.send('');
    xhr.onreadystatechange = function()
    {
        if(xhr.readyState === 4)
        {
            return xhr.status == 200 ? true : false;
        }
    }
}
И вызывать
var settings_file = ifFileExist(settingsFile) ? settingsFile : "./camera-resolutions.json";
request(settings_file, function(o)
{
...
}
Но xhr.status возвращает 0. Где почитать, что бы научиться в эти штуки?

★★★★

Последнее исправление: yacuken (всего исправлений: 1)

Если тебе нужно проверить наличие файла - делай HEAD запрос, а не GET.

Ja-Ja-Hey-Ho ★★★★
()
function ifFileExist(url, callback)
{
    var xhr = new XMLHttpRequest();
    xhr.open('HEAD', url, true);
    xhr.send();
    xhr.onreadystatechange = function()
    {
        if(xhr.readyState == 4)
        {
            callback(Math.floor(xhr.status / 100) == 2);
        }
    }
}

ifFileExist('https://www.linux.org.ru', function (exists) { console.log(exists); });
Ja-Ja-Hey-Ho ★★★★
()
Последнее исправление: Ja-Ja-Hey-Ho (всего исправлений: 2)
Ответ на: комментарий от Ja-Ja-Hey-Ho

Math.floor(xhr.status / 100) == 2

А это еще что за фокусы? почему нельзя написать xhr.status == 200?

Вообще, ты все через жопу по-моему делаешь. Тебе в этом случае readyState вообще дожидаться не надо, выходить стазу со статусом. readyState формируется уже после того как статус получен.

portquest2016
()
Ответ на: комментарий от portquest2016

Файл локальный.
Уже вычитал по ссылке, что deep-purple давал, что для ftp://, file:// статус всегда 0

yacuken ★★★★
() автор топика
Ответ на: комментарий от portquest2016

Ты наркоман, уходи в лес. Я просто его пример правил.

Ja-Ja-Hey-Ho ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.