javascript - 在 for 循环之后执行 javascript

标签 javascript jquery ajax sharepoint callback

我有一个 for 循环,它从子站点中的列表中获取数据,以使用异步 ajax 请求在页面上构建一个 html 列表,这可行,但我希望在生成列表后对其进行排序,以按字母顺序显示列表命令。我正处于 javascript 的学习曲线上,因此我们将不胜感激。我需要在 onWebsLoaded 函数完成后运行 sortProjects 函数。

    function onWebsLoaded(sender, args) {
    for (var i = 0; i < this.webs.get_count(); i++) 
    {
        client = "";
        var title = this.webs.itemAt(i).get_title();
        var desc = this.webs.itemAt(i).get_description();
        var url = this.webs.itemAt(i).get_serverRelativeUrl();
        id = (title).replace(/\ /g, "");
        getProjectProperties(url, title, desc, client, id); 
    }
}
function sortProjects () {
    tinysort('ul#projectstable>li');
}
function getProjectProperties (url, title, desc, client, id) {
    $.ajax({
        url: url + "/_api/web/lists/getbytitle('Project Properties')/items('1')",
        method: "GET",
        headers: { "Accept": "application/json; odata=verbose" },
        success: function (data) {
                    client = data.d.Title;
                    $('#projectstable').append("<li id='" + id + "' class='ms-ListItem'><a href='" + url + "'><span id='" + id + "Client' class='ms-ListItem-primaryText'>" + title + "</span><span class='ms-ListItem-secondaryText'>" + client + "</span><span class='ms-ListItem-tertiaryText'>" + desc + "</span></a></li>");
        },
        error: function () {
                    $('#projectstable').append("<li id='" + id + "' class='ms-ListItem'><a href='" + url + "'><span id='" + id + "Client' class='ms-ListItem-primaryText'>" + title + "</span><span class='ms-ListItem-secondaryText'>" + client + "</span><span class='ms-ListItem-tertiaryText'>" + desc + "</span></a></li>");
        }
    });
}

最佳答案

您可以修改您的逻辑,以便存储从 $.ajax() 调用返回的 promise 数组。然后您可以apply() 该数组到$.when 并调用sortProjects()。试试这个:

function onWebsLoaded(sender, args) {
    var requests = [];
    for (var i = 0; i < this.webs.get_count(); i++)  {
        client = "";
        var title = this.webs.itemAt(i).get_title();
        var desc = this.webs.itemAt(i).get_description();
        var url = this.webs.itemAt(i).get_serverRelativeUrl();
        id = (title).replace(/\ /g, "");
        requests.push(getProjectProperties(url, title, desc, client, id)); 
    }
    $.when.apply($, requests).done(sortProjects);
}

function sortProjects () {
    tinysort('ul#projectstable>li');
}

function getProjectProperties (url, title, desc, client, id) {
    // note 'return' below
    return $.ajax({
        url: url + "/_api/web/lists/getbytitle('Project Properties')/items('1')",
        method: "GET",
        headers: { "Accept": "application/json; odata=verbose" },
        success: function (data) {
            client = data.d.Title;
            $('#projectstable').append("<li id='" + id + "' class='ms-ListItem'><a href='" + url + "'><span id='" + id + "Client' class='ms-ListItem-primaryText'>" + title + "</span><span class='ms-ListItem-secondaryText'>" + client + "</span><span class='ms-ListItem-tertiaryText'>" + desc + "</span></a></li>");
        },
        error: function () {
            $('#projectstable').append("<li id='" + id + "' class='ms-ListItem'><a href='" + url + "'><span id='" + id + "Client' class='ms-ListItem-primaryText'>" + title + "</span><span class='ms-ListItem-secondaryText'>" + client + "</span><span class='ms-ListItem-tertiaryText'>" + desc + "</span></a></li>");
        }
    });
}

关于javascript - 在 for 循环之后执行 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38660302/

相关文章:

jQuery 选择 : how to select 1 option value and remove the same one in another select-menu?

jQuery 自动完成结果顺序

javascript - div 替换它之后的所有内容,AJAX、PHP、JAVASCRIPT

php - Jquery对话框错误

javascript - Koa中,中间件中的await next()、return await next()、return next()、next()有什么区别?

javascript - 如何将键值列表转换为对象数组?

javascript - 既然 $.browser 已被弃用,我如何使用 jQuery 检测 IE 8?

javascript - Ajax 调用完成成功后,才真正完成调用?

javascript - 为所有子项添加事件监听器

javascript - 动态 JavaScript 驱动页面的 SEO