执行下一行之前的回调等待

时间:2016-05-19 03:00:17

标签: jquery callback asynccallback

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()是一个从服务器加载项目的函数。它是sharepoint JSOM代码。

当我展开树节点时,“LazyLoad”函数被调用,但它不等待GetFolders()函数从服务器获取项目并分配给结果数组但是它转到$ .when的下一行( ).then()并将data.result分配给结果,这是一个空数组。

我想等待执行GetFolders()函数,然后将data.result分配给包含5个项目的结果数组。

更新 以下代码有效。

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();
});

1 个答案:

答案 0 :(得分:0)

.then()的参数必须是函数。当承诺得到解决时,它将被调用。

我正在使用延迟加载功能在树控件中加载项目。

function InitTree() {
    $("#tree").fancytree({
        lazyLoad: function lazyLoad(event, data) {
            var result = [];
            $.when(GetFolders(function (items) {
                //Items array has 5 items now
                result = items;
            })).then(function() {
                data.result = result);
            });
        }
    });
}