Возвращаемое значение от функции с вызовом Ajax [дубликат]

Да. Существует формат, называемый CSVWithNames, при котором во время синтаксического анализа как первая, так и вторая строки полностью игнорируются.

5
задан Mussnoon 18 February 2009 в 19:23
поделиться

2 ответа

Проблема - это onreadystatechange не будет стрелять до... ожидают его... изменения состояния. Таким образом, когда Вы return status; большую часть времени состояние не будет иметь времени для установки. То, что необходимо сделать, return false; всегда и в onreadystatechange определите, хотите ли Вы продолжить двигаться или нет. Если Вы делаете, то Вы отправляете форму. Короче говоря, возьмите код, который обрабатывает возвращаемое значение и вместо этого выполняет его из readystatechange обработчика. Можно сделать это непосредственно:

request.onreadystatechange = function() {
    if (request.readyState == 4) {
        var resp = parseInt(request.responseText, 10);
        switch (resp) {
        case 0:
            document.getElementById('myform').submit();
            break;
        case 1:
            alert("The display name has already been taken.");
            break;
        case 2:
            alert("This student ID has already been registered");
            break;
        }
    }
}
return false; // always return false initially

или путем передачи продолжения функции, которая выполняет асинхронный вызов:

function checkUser(success, fail) {
    ...
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            var resp = parseInt(request.responseText, 10);
            switch (resp) {
            case 0:
                success(request.responseText);
            case 1:
                fail("The display name has already been taken.", request.reponseText);
                break;
            case 2:
                fail("This student ID has already been registered", request.reponseText);
                break;
            default:
                fail("Unrecognized resonse: "+resp, request.reponseText);
                break;
            }
        }
    }

В дополнение к этому, перед значением по умолчанию return false; Вы могли бы хотеть иметь своего рода индикатор, на который что-то идет, возможно, отключите отправлять поле, покажите загружающийся круг и т.д. Иначе пользователи могли бы запутаться, если требуется много времени для выборки данных.

Дальнейшее объяснение

Хорошо, таким образом, причина, Ваш путь не работал, находится главным образом в этой строке:

request.onreadystatechange = function() {

Что это делает, говорит это когда onreadystatechange из изменений запроса Ajax будет работать анонимная функция, которую Вы определяете. Этот код не выполняется сразу же. Это ожидает события для случая. Это - асинхронный процесс, таким образом, в конце функционального определения JavaScript будет продолжать идти, и если состояние не изменилось к тому времени, когда это добирается до return status; переменная status не будет, очевидно, иметь времени для установки, и сценарий не работал бы как ожидалось. Решение в этом случае к всегда return false; и затем когда событие стреляет (т.е., сервер ответил выводом сценария PHP), можно затем определить состояние и отправить форму, если все - a-ok.

11
ответ дан 18 December 2019 в 14:52
поделиться

Возможно выполнить отправить метод синхронно, таким образом, request.responseText сразу будет доступен, но это обычно не хорошая идея. Запрос подвесит браузер, пока это не будет завершено.

Для установки запроса как синхронного установите третий параметр на request.open ко "лжи".

function checkUser() {
    var request;
    var status = false;

    //create xmlhttprequest object here [called request]

    var stu_id = document.getElementById("stu_id").value;
    var dName = document.getElementById("dName").value;
    var fileName = "check_user.php?dName=" + dName + "&stu_id=" + stu_id;
    request.open("GET", fileName, false);
    request.send(null);

    if (request.status === 200) {
        var resp = parseInt(request.responseText, 10);
        if(resp === 1) {
            alert("The display name has already been taken.");
            status = false;
        }
        else if(resp === 2) {
            alert("This student ID has already been registered");
            status = false;
        }
        else if(resp === 0) {
            status = true;
        }
    }
    else {
        alert("Request failed");
        status = false;
    }

    return status;
}

Как я упомянул прежде, хотя, это не хорошая идея. Это - почти всегда лучшая идея сделать запрос асинхронно, таким образом, другой код может работать, в то время как Вы ожидаете ответа. Существует причина, Ajax завоевал популярность вместо Sjax.

2
ответ дан 18 December 2019 в 14:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: