Дождаться завершения внешнего метода перед завершением? - PullRequest
0 голосов
/ 28 февраля 2011

Я делаю небольшое приложение для календаря на PHP и JavaScript. Чтобы заполнить события div на первой странице, я запускаю эту функцию:

function populateEvents() {

    $.ajax({  
        type: "GET",  
        url: "populateEvents.php",
        success: function(data, textStatus, XMLHttpRequest) {  
            $('#events').html(data);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            alert("Status: " + textStatus + ". Error thrown: " + errorThrown);
        }
    });
}

Довольно просто, populateEvents.php выполняет большую часть работы.

Теперь, когда я хочу добавить событие, я вызываю следующую функцию:

function createEvent(u_id) {
    var title = $("#titleInput").val();
    var type = $("#typeSelect").val();
    var location = $("#locationInput").val();
    var date = $("#inputDate").val();
    var time = $("#inputTime").val();
    var allday = $('#allDaySelect:checked').val() !== undefined ? '1' : '0';
    var duedate = type == 'todo' ? date : '';
    var notes = $("#inputNotes").val();
    var output = 'u_id=' + u_id + '&title=' + title + '&type=' + type + '&location=' + location + '&date=' + date + '&time=' + time + '&allday=' + allday + '&duedate=' + duedate + '&notes=' + notes;


    $.ajax({  
        type: "GET",  
        url: "addEvent.php", 
        data: output,
        success: function(data, textStatus, XMLHttpRequest) {  
            if (data == '') {
                toggleNewEvent();
                populateEvents();
            } else {
                // extract form problems from formProblems, in form: title=empty&date=empty&...

                var errorArray = data.split("&");
                var fields = '';
                $.each(errorArray, function(index, value) {
                    var field;
                    var smallArray = value.split("=");
                    field = smallArray[0];
                    fields = fields + field + ', ';
                });
                alert('You must fill in the following fields: ' + fields);
            }
        },
        error: function(jqXHR, textStatus, errorThrown) {
            alert("Status: " + textStatus + ". Error thrown: " + errorThrown);
        }
    });
}

Немного сложнее, но я уверен, что ты понял суть. Значения, отправленные на addEvent.php, возвращенная проанализированная строка и т. Д., События повторно заполнены. Теперь я просто реструктурировал всю сторону PHP, чтобы реализовать класс eventlist и класс событий. Раньше файл addevent.php выполнял всю реальную работу бэкэнда, но теперь этот файл (после некоторой проверки) сводится к следующему:

if ($return == '') {
        /*If return is empty, everything is fine, carry on.*/
        $eventlist->addEvent($u_id, $title, $type, $date, $time, $allday, $location, $dueby, $notes);
    } else {
        /*Throw an error*/
        echo ($return);
    }

В результате, однако, этот файл возвращается к функции JavaScript при отправке этого запроса к объекту eventlist для выполнения метода addEvent. Затем функция пытается немедленно заполнить событие div, и в результате оно не работает, потому что метод addEvent еще не завершен. Однако когда вы обновляете страницу, она работает нормально, поэтому я знаю, что она вставляет их правильно, просто нужно дождаться окончания работы второго файла PHP.

1 Ответ

1 голос
/ 28 февраля 2011

Почему бы не вернуть часть $eventlist->addEvent($u_id, $title, $type....... в сценарий, echo $eventlist->addEvent($u_id, $title, $type........

Затем в вашем методе addEvent что-то вернуть, то есть идентификатор события.

Тогда вместо того, чтобы проверить, что страница пуста, вы проверяете идентификатор ( if (!isNaN(data)) isNotANumber ) , таким образом, вы знаете, что закончили вставку Ваше событие как ваша страница не вернется, пока не будет идентифицировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...