在完成之前等待外部方法完成?

时间:2011-02-28 10:55:30

标签: php javascript jquery ajax oop

我正在使用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);
    }

然而,当该文件将该请求发送到eventlist对象以执行addEvent方法时,该文件将返回到JavaScript函数。然后该函数立即尝试填充事件div,因此它不起作用,因为addEvent方法尚未完成。但是,当你刷新页面时,它工作正常,所以我知道它正确插入它们,它只需要等待第二个PHP文件完成。

1 个答案:

答案 0 :(得分:1)

为什么不将$eventlist->addEvent($u_id, $title, $type.......部分返回给脚本, echo $eventlist->addEvent($u_id, $title, $type.......

然后在你的addEvent方法中返回一些内容,即事件的ID。

然后,您检查的是ID if (!isNaN(data)) isNotANumber ,而不是检查页面是否为空白,因此您知道你已经完成插入你的活动,因为你的页面在有了ID之前就不会返回。