Программно расширяющиеся узлы в jstree с загрузкой ajax

У меня есть дерево, созданное с помощью jstree, которое загружается частично и загружается через плагин json_data, когда вы расширяете узлы. Вот'Суть кода:

$("#TreeViewDiv")   
.jstree(
{
    json_data:
    {
        ajax:
        {
            url: "/Website/GetNodes",
            data: function (node) {
                //do some stuff to compile data for backend here

                return {
                    //insert data for backend here
                };
            },
            error: function () {
                $("#TreeViewDiv").html("Error initializing tree");
            }
        }
    },

    plugins: ["json_data", "ui"]
});

Затем я хочу расширить некоторые узлы и выбрать конечный узел, в зависимости от того, какой пользователь обращается к сайту. Я делаю это в цикле следующим образом:

var nodeValues = [Parent, firstChild, leaf];

        for (var j = 0; j < nodeValues .length-1; j++) {        
            $("#TreeViewDiv").jstree("open_node", $("input[value='" + nodeValues [j] + "']"));
        }

Открытие родительского узла работает нормально, и firstChild открывается, когда отображается дерево, но узел firstChild не открыт. Если я снова запускаю цикл, первый ребенок открывается успешно, чтобы показать листовой узел.

Я думаю, что запрос неt завершено, а узел дерева firstChild не 'не существует, когда вышеуказанный цикл пытается открыть его. Есть ли способ дождаться загрузки узлов, прежде чем пытаться открыть следующий узел? Спасибо!

Ответы на вопрос(1)

Решение Вопроса

Хорошо, так что я понял это в конце концов. Вот'способ сделать это с отсрочкой. Там'Возможно, более аккуратный способ, но у меня болит голова после дня игры с этим, поэтому рефакторинг придется подождать :)

var deffereds = $.Deferred(function (def) { def.resolve(); });

var nodeValues = [Parent, firstChild, leaf];

for (var j = 0; j < nodeValues .length-1; j++) {  
deffereds = (function(name, deferreds) {
                return deferreds.pipe(function () {
                    return $.Deferred(function(def) {
                                                    $("#TreeViewDiv").jstree("open_node", $("input[value='" + name + "']"), function () {
                            def.resolve();
                        });
                    });
                });
            })(nodeValues [j], deffereds);      
 }

Это в основном помещает вызов open_node в deferred и использует обратный вызов из функций open_node для разрешения deferred, таким образом гарантируя, что ни один узел не будет открыт до открытия его родителя.

Ваш ответ на вопрос