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

我正在用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方面,以实现事件列表类和事件类。 以前, addevent.php文件完成了所有实际的后端工作,但是现在,该文件(在一些validation之后)归结为:

 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文件完成。

为什么不返回$eventlist->addEvent($u_id, $title, $type....... part到脚本, echo $eventlist->addEvent($u_id, $title, $type.......

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

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