function GetFolders(callback) {
var query = new CamlBuilder().Where().TextField("ContentType").EqualTo("Folder").ToString();
var hostweburl = decodeURIComponent(getQueryStringParameter("SPHostUrl"));
var scriptbase = hostweburl + '/_layouts/15/';
$.getScript(scriptbase + 'SP.RequestExecutor.js', function () {
sendRequest(query, function myfunction() {
var listEnumerator = spItems.getEnumerator();
var items = [];
var item;
while (listEnumerator.moveNext()) {
item = listEnumerator.get_current();
items.push({ "title": item.get_item("FileLeafRef"), "lazy": true });;
}
callback(items);
})
});
}
function InitTree() {
$("#tree").fancytree({
lazyLoad: function lazyLoad(event, data) {
var result = [];
$.when(GetFolders(function (items) {
//Items array has 5 items now
result = items;
})).then(data.result = result);
data.result = result;
}
});
}
$(document).ready(function () {
InitTree();
});
GetFolders() is a function that loads items from the server. it is sharepoint JSOM code.
When I expand the tree node "LazyLoad" function is called but it does not wait for the GetFolders() function to get items from the server and assign to result array but it goes to the next line of the $.when().then() and assign data.result to result which is an empty array.
I want to wait for the execution of GetFolders() function and then assign data.result to result array that has 5 items.
Update Following code worked.
function GetFolders(dfd) {
var deferredObject = $.Deferred();
var query = new CamlBuilder().Where().TextField("ContentType").EqualTo("Folder").ToString();
var hostweburl = decodeURIComponent(getQueryStringParameter("SPHostUrl"));
var scriptbase = hostweburl + '/_layouts/15/';
$.getScript(scriptbase + 'SP.RequestExecutor.js', function () {
sendRequest(query, function myfunction() {
var listEnumerator = spItems.getEnumerator();
var item;
var items = [];
while (listEnumerator.moveNext()) {
item = listEnumerator.get_current();
items.push({ "title": item.get_item("FileLeafRef"), "lazy": true });;
}
dfd.resolve(items);
})
});
}
function InitTree() {
$("#tree").fancytree({
lazyLoad: function lazyLoad(event, data) {
data.result = $.Deferred(function (dfd) {
GetFolders(dfd);
});
}
});
}
$(document).ready(function () {
InitTree();
});