Jquery JSTree竞争条件,其中AJAX成功回调可能具有错误的节点

Jquery JSTree竞争条件,其中AJAX成功回调可能具有错误的节点,jquery,jstree,race-condition,Jquery,Jstree,Race Condition,我有一个jstree的json_数据实现,允许用户打开树中的不同节点并查看内容。基本上是: .jstree({ "plugins" : [ "json_data", "ui" ], "ui" : { "select_multiple_modifier": "on", "selected_parent_close": "deselect" },

我有一个jstree的json_数据实现,允许用户打开树中的不同节点并查看内容。基本上是:

               .jstree({
                "plugins" : [ "json_data", "ui" ],
                "ui" : { "select_multiple_modifier": "on",
                         "selected_parent_close": "deselect" },
                "json_data" : {
                    "ajax" : {
                        "url": function(node) {
                            ... return a url ...
                        },
                        "success": function(metadata, textStatus, jqXHR) {
                            var parent = this._get_node();  // <- RACE CONDITION
                            return parseMetaDataNodes(metadata, parent);
                        }
                    }
                }
.jstree({
“插件”:[“json_数据”,“ui”],
“ui”:{“选择多个修改器”:“打开”,
“所选父项关闭”:“取消选择”},
“json_数据”:{
“ajax”:{
“url”:函数(节点){
…返回一个url。。。
},
“成功”:函数(元数据、文本状态、jqXHR){

var parent=this._get_node();//我遇到了类似的问题,最后我使用了您的第二个解决方案,即在清除标志之前阻止进一步执行select_node函数:

 $("#treeHost").jstree({Your Plugin setup code}).bind("before.jstree", function(event, data) {
                if (data.func == "select_node" && !canSelectNodes) {
                    event.stopImmediatePropagation();
                    return false;
                }
            })
根据官方文档,
before.jstree
是一个特殊事件,您可以绑定它来阻止操作执行。我检查要执行的函数是否为
select\u node
,如果是,如果
canSelectNodes
为false,则不要执行它


通过这种方式,您可以在代码中的其他地方切换
canSelectNodes
将true标记为false,以防止树接受节点选择。

这样做,用户体验也不像我想象的那么糟糕,特别是因为JSTree在构建节点后会缓存节点,因此取消选择和重新选择很快。在这是一个开源项目: