AJAX以错误的顺序回归
好的,所以我正在为我正在进行的项目写一个小聊天系统。 我一直在尝试在这个过程中学习AJAX,而且一切似乎都很顺利。 我的AJAX运行一个打开目录的PHP页面,AJAX从页面接收目录作为Array(DirectoryList)。 然后反复加载另一个AJAX函数,直到所有聊天日志都附加到DIV。
我的问题是ChatLogs没有按正确的顺序加载。
例如,如果我有日志:
- 1.TXT
- 2.txt
- 3.txt
- 4.txt
它们将被附加到ChatContainer DIV中:
- 2.txt
- 1.TXT
- 4.txt
- 3.txt
而不是正确的顺序。
这是我的代码:
var ChatList = new Array(); var p; var DirectoryList = new Array(); var ChatString = ''; function loadChat(variable) { var req = new XMLHttpRequest(); req.onreadystatechange = function () { if (req.readyState == 4 && req.status == 200) { DirectoryList = JSON.parse(req.responseText); var p = variable; while (p < DirectoryList.length) { loadLog(p); p++; } } } //END REQ1 //Post Chat to DIV function loadLog(p) { $.get('chat/log/' + DirectoryList[p], function (data2) { ChatList.push(data2); $('#ChatContainer').append(data2); }); } //End req.open('GET', 'process/ReadChatLogs.php', true) req.send(null); } loadChat(0);
Ajax不能保证以您请求的顺序完成,因为服务器返回一个请求可能比下一个请求更长。 要解决这个问题,请等待它们全部完成,然后遍历原始集合并附加结果。 以下是如何使用延迟对象执行此操作。
var ChatList = new Array(); var p; var DirectoryList = new Array(); var ChatString = ''; function loadChat(variable) { var req = new XMLHttpRequest(); req.onreadystatechange = function () { if (req.readyState == 4 && req.status == 200) { DirectoryList = JSON.parse(req.responseText); var p = variable; var defArr = []; // store references to deferred objects while (p < DirectoryList.length) { defArr.push(loadLog(p)); p++; } $.when.apply($,defArr).done(function(){ // apply handler when all are done // handle case where only one ajax request was sent var args = arguments; if ($.type(args[0]) != "array") { args = []; args[0] = arguments; } // loop over and ouput results. var outHTML = ""; $.each(args,function(i){ outHTML += args[i][0]; ChatList.push(args[i][0]); }); $("#ChatContainer").append(outHTML); }); } } //END REQ1 //Post Chat to DIV function loadLog(p) { return $.get('chat/log/' + DirectoryList[p]); } //End req.open('GET', 'process/ReadChatLogs.php', true) req.send(null); }
编辑:固定大小写,其中只发送一个ajax请求