1

嗨,首先对不起我的英语不好。我已经在 SO 中搜索过了。但我没有得到我需要的确切答案。我的问题是我需要同步 Ajax 请求。我知道我们可以使用“ asynch : false ”。但这会使浏览器锁定。我的网络中有一个文件夹树(我正在使用“ tafel 树”js)。树节点是在运行时生成的。每次用户单击一个节点时,它都会向服务器发送请求并将该节点添加到树中。但问题是如果通过单击f5刷新页面,那么我需要加载我之前已经选择的树结构。我使用“ asynch : false ”实现了它。但这会使浏览器太慢。

这就是我所拥有的

function loadPage() { 
/* some other codes are here*/
/* here i call an ajax for get the inside folder list in correct order.(i am usig     protoype)*/
    new Ajax.Request(ajaxGetInsideFolderIdsUrl,
    {
     parameters: {branchId: CurrentSelectfolderId},
     onSuccess:  function(res) {
            /* onSuccess i call another function*/
            var brs = res.responseText.split(","); // branch ids in correct order.
            syncFolder(brs)
    }
}

function syncFolder(brs){
for(var i= 0 ; i < brs.length; i ++){  
    var tempbranch = tree.getBranchById(brs[i].getId());              
    selectAfterChange( tempbranch) 
    /* 
     selectAfterChange function is used for selecting current branch. calling "tafle  tree" select() function in side it.
     i just created an copy of "select()","_openPopulate()" functions used in "tafle  tree" and modified it with "asynch : false ".and now its working fine.
*/  
}
}
function selectAfterChange(brs){
    brs.chk_select(); 
    /* for selecting the branch (created a copy of current "select()" function used in "tafle tree" js  
    and modified it with "asynch : false "and now its working fine.) */
    showList();// for listing items in side that folder (in another Ajax page). 
}

我的问题是如果用户打开了一个长分支。然后刷新页面,由于同步 Ajax 调用,加载将花费太多时间。花太多时间对我来说不是什么大问题。但是浏览器被锁定,直到所有请求都被执行。有没有其他方法可以做到这一点。

4

1 回答 1

0

我不熟悉您正在使用的树库,但一般来说,您解决此问题的方法是将当前扩展的路径存储在浏览器中(本地存储、cookie 或任何地方),并且刷新页面时,仅加载可见的节点。

假设用户当前正在查看路径一/二/三/四。您将该路径保存在某处,然后当页面再次加载时,您创建一个路径队列以从后端请求,方法是拆分路径并逐个附加路径的组件:

["one", "one/two", "one/two/three"]

然后,您发送“一”的 AJAX 请求,当您返回结果时,更新树中的该节点,并发送“一/二”的请求。当该请求返回时,更新树,并发送“一/二/三”请求。

根据您的设计,您可以开始用更多异步请求填充树的其余部分......

于 2013-03-05T05:58:39.500 回答